为什么有一个规则,即临时对象必须具有不同的地址?

时间:2018-11-22 07:40:38

标签: c++ object-model

我感兴趣的情况是

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

我知道好像字面值123是用于初始化临时int的参数,而const只是无聊的编译时检查,但是我想知道原因为什么在这种情况下需要不同的临时工,而不是n1n2都具有相同的临时工。

我知道the rule exists,但不知道为什么存在此规则。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

如果您希望他们使用相同的地址,则可以随时执行const int &n2 = n1。如果您以其他方式执行此操作,则编译器可能会怀疑您有自己的理由。

不允许编译器猜测您关心的是什么。它实现您编写的内容。根据您的建议进行优化将意味着比较bool test = &n1 == &n2将给出另一个结果。一般来说,只要不修改结果,编译器就可以进行优化。

您应该考虑到以前的编译器的效率要比现在低得多。这种优化或语言功能在30年前是不可能的。因此,如果不是最优化的话,那将是对语言的修改,有可能改变许多现有程序的行为。