Являются ли буквальные числа изменчивыми или нет? - PullRequest
17 голосов
/ 22 декабря 2011

Естественно, это не скомпилируется:

int &z = 3; // error: invalid initialization of non-const reference ....

, и это скомпилируется:

const int &z = 3; // OK

Теперь рассмотрим:

const int y = 3;
int && yrr = y; // const error (as you would expect)
int && yrr = move(y); // const error (as you would expect)

Но эти следующие строки компилируются для меня.Я думаю, что это не должно.

int && w = 3;
int && yrr = move(3);
void bar(int && x) {x = 10;}
bar(3);

Разве эти последние две строки не позволят модифицировать литерал 3?В чем разница между 3 и const int?И, наконец, есть ли опасность с «модификацией» литералов?

(g ++ - 4.6 (GCC) 4.6.2 с -std=gnu++0x -Wall -Wextra)

1 Ответ

13 голосов
/ 22 декабря 2011

Rvalue ссылка на литерал 3:

int && w = 3;

фактически связан с временным значением, которое является результатом вычисления выражения 3. Это не связано с каким-то платоническим литералом 3.

(все следующие ссылки на стандарты взяты из проекта за март 2011 года, n3242)

3.10 / 1 "Lvalues ​​и rvalues"

Значение литерала, такого как 12, 7.3e5 или true, также является prvalue

Тогда 8.5.3 «Ссылки» дает правила того, как ссылка связана с последним случаем, который гласит:

В противном случае временный тип «cv1 T1» создается и инициализируется из выражения инициализатора с использованием правил неинициализированной инициализации копирования (8.5). Ссылка затем привязывается к временному.

и приводит в качестве примера нечто очень близкое к тому, что есть в вашем вопросе:

double&& rrd = 2; // rrd refers to temporary with value 2.0
...