我感兴趣的情况是
const int &n1 = 123;
const int &n2 = 123;
我知道好像字面值123
是用于初始化临时int
的参数,而const
只是无聊的编译时检查,但是我想知道原因为什么在这种情况下需要不同的临时工,而不是n1
和n2
都具有相同的临时工。
我知道the rule exists,但不知道为什么存在此规则。
答案 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年前是不可能的。因此,如果不是最优化的话,那将是对语言的修改,有可能改变许多现有程序的行为。