В C ++ может измениться значение const &
?
Ну, конечно, оно не может измениться, не так ли?Вот что означает const
.Более того, слушайте Страуструпа:
A const
lvalue ссылка относится к константе, которая является неизменной с точки зрения пользователя ссылки.
Но как насчет этого?
#include <iostream>
int main() {
int a = 0;
const int& r = a;
const int old_r = r;
++a;
const int new_r = r;
std::cout
<< "old_r == " << old_r
<< " but new_r == " << new_r << std::endl;
return 0;
}
На моей машине это выдает: old_r == 0 but new_r == 1
.
Это касается моего реального вопроса.В приведенном выше коде посмотрите на строку
const int new_r = r;
, поскольку
- адрес
&new_r
не извлекается ни в этой строке, ни в другом месте кода и - в коде ничего нет
volatile
,
что-нибудь мешает оптимизирующему компилятору объединить old_r
и new_r
в один константный объект, обрабатывая строку, как если бы она читалась следующим образом?
const int& new_r = old_r;
Я спрашиваю, потому что, насколько я знаю, если бы компилятор так оптимизировал, это могло бы изменить поведение.Программа может вывести: old_r == 0 but new_r == 0
.
СВЯЗАННЫЕ ВОПРОСЫ
Наиболее близкий из существующих вопросов, которые я нашел, это:
Следующие вопросы также связаны, но, в отличие отВ данном вопросе участвуют преобразования:
См. Также N4659 (черновик стандарта C ++ 17), раздел.10.1.7.1, " cv-qualifiers. "
Цитата Страуструпа вверху вопроса взята из секты.7.7.2 из Язык программирования C ++, 4-е изд.Конечно, ни один автор не может написать каждое предложение идеально в книге на тысячу страниц;все же, возможно, Страуструп ясен, и я просто неправильно его прочитал.Тем не менее, вы можете понять, почему это предложение смутило меня.Вот почему я спросил.