为什么规定临时对象必须有不同的地址?

Why is there a rule that temporary objects must have distinct addresses?

我感兴趣的情况是

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

我知道这好像字面量 123 是初始化临时参数 intconst 只是无聊的编译时检查,但我想知道在这种情况下需要不同临时文件的原因,而不是 n1n2 都具有相同的临时文件。

我知道 但不知道为什么存在这条规则。

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

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

您应该考虑到以前的编译器比现在效率低得多。这样的优化或语言特性在 30 年前应该是不可能的。因此,即使它不是优化,也将是对语言的修改,可能会改变许多现有程序的行为。

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

I want to know the reason why distinct temporaries are needed in this case.

因为 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