Подтвердить что ты не робот

Имеются ли переменные или нет?

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

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)

4b9b3361

Ответ 1

Ссылка 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