Константа & относится к энергонезависимой переменной.Переменная меняется.Делает ли изменение недействительным const &? - PullRequest
0 голосов
/ 21 февраля 2019

В 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-е изд.Конечно, ни один автор не может написать каждое предложение идеально в книге на тысячу страниц;все же, возможно, Страуструп ясен, и я просто неправильно его прочитал.Тем не менее, вы можете понять, почему это предложение смутило меня.Вот почему я спросил.

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

В C ++ может ли значение const & измениться?

Да, но не через эту ссылку (игнорируя поля mutable).

void foo(const int& c, int& mut) {
    std::cout << c << " ";
    ++mut; // changes `c` if &c == &mut
    std::cout << c << std::endl;
}

и

int a = 42;
foo(a, a); // 42 43

что-нибудь мешает оптимизирующему компилятору объединить old_r и new_r в один константный объект, обрабатывая строку, как если бы она читалась следующим образом?

Правило «как если» позволяет компилятору оптимизировать, если видимый побочный эффект одинаков,
, что не , как здесь.Таким образом, ваше «предложенное слияние переменных» в вашем коде не может быть выполнено к счастью.

0 голосов
/ 21 февраля 2019

Да, значения const могут меняться.Когда вы делаете

const int&    r = a;

, вы создаете ссылку на const int.Код, который использует эту переменную, не сможет изменить значение через ссылку.Но это никоим образом не говорит о том, что сохраненное там значение не изменится.

Рассматривайте его как переменную с правами только для чтения.Некоторый другой фрагмент кода может иметь доступ для записи.

Вы должны сравнить с constexpr, которые являются действительно константными выражениями.

0 голосов
/ 21 февраля 2019

Ну, конечно, это не может измениться, не так ли?Вот что значит const.

Нет, это не так.

const означает вы не можете ничего изменить.Это не значит, что это не изменится.Это не значит, что это константа.

const просто дает вам неизменный взгляд на вещь.Могут быть и другие представления об этой вещи, и они могут быть изменяемыми.

делает все, что не позволяет оптимизирующему компилятору объединить old_r и new_r в один постоянный объект

Да: тот факт, что один из них будет иметь неправильное значение.

0 голосов
/ 21 февраля 2019

В C ++ может ли значение const & изменить?

Да, это совершенно законно.Принятие const& для некоторой переменной не останавливает возможность ее изменения, это просто означает, что вы не можете изменить переменную через ссылку.Это означает, что

int a = 42;
int const& b = a;
++a;
std::cout << a << " " << b;

напечатает

43 43

Если бы я попытался сделать

++b;

, хотя это было бы ошибкой компилятора при доступе bзначение const и ++ неконстантная операция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...