Почему существует правило, что временные объекты должны иметь разные адреса? - PullRequest
0 голосов
/ 22 ноября 2018

Интересующая меня ситуация:

const int &n1 = 123;
const int &n2 = 123;

Я знаю, что это что-то такое, как будто литерал 123 - это параметр для инициализации временного int, а const - просто скучное время компиляции.проверьте, но я хочу знать причину, по которой в этом случае нужны разные временные фильтры, вместо n1 и n2, имеющих оба временных значения.

Я знаю правило существует но не знаю, почему существует это правило.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018
const int &n1 = 123;
const int &n2 = 123;

Я хочу знать причину, по которой в этом случае необходимы отдельные временные фильтры.

Поскольку комитет C ++, вероятно, не заботился об этом конкретном случае.Что у них на уме, какова была их цель, так это предоставить правила того, как временные обрабатываются в более полезном и распространенном случае: оценка создания цепочки полного выражения, использования и уничтожения временных:

class A { /* ... */ };
A make_a();
void consume_a(A&&);
void use_a(A const&);

consume_a(make_a());
use_a(make_a());

Очевидно, make_a() необходимо производить разные временные A каждый раз.

0 голосов
/ 22 ноября 2018

Если вы хотите, чтобы у них был один и тот же адрес, вы всегда можете сделать const int &n2 = n1.Если вы сделаете это по-другому, компилятор может заподозрить, что у вас есть собственная причина для этого.

Компилятору не разрешено угадывать, что вас беспокоит.Он реализует то, что вы пишете.Выполнение оптимизации в соответствии с вашим предложением подразумевает, что сравнение bool test = &n1 == &n2 даст другой результат.Вообще говоря, компилятору разрешено выполнять оптимизацию, если результат не изменяется.

Следует учитывать, что предыдущие компиляторы были намного менее эффективны, чем сейчас.Такая оптимизация или языковая функция должны были быть невозможны 30 лет назад.Таким образом, если это не оптимизация, это будет модификация языка, которая потенциально изменит поведение многих существующих программ.

...