你能在 C++ 中访问匿名 objects/types 吗?

Can you access anonymous objects/types in C++?

我目前正在学习 C++ 中的引用。这是我一直想知道的事情:

int x = 5;
const int &ref = 3 * x + 1;

我对此的理解是,为这个表达式3 * x + 1创建了一个匿名变量存储在其中。之后,我们将引用 ref 绑定到那个匿名变量。这样我们就可以访问它,尽管我们不能更改值,因为它的类型是 const.

问题: 除了使用引用 ref 之外,还有什么方法可以访问这个匿名 variable/object 吗?一般来说,C++是否允许访问这些匿名对象?

这称为临时对象(它不是变量)。而且它不存储表达式,而是存储表达式的结果

通常这样的对象在创建它们的完整表达式结束时被销毁。但是,如果引用 立即 绑定到它们,那么这些对象将与该引用一样长地存在(有些例外情况不适用于此处)。

所以是的,你可以在这里使用 ref 就像你写

const int ref = 3 * x + 1;

相反。 (有一些小例外,例如 decltype(ref) 不同。)

除了绑定对它们的引用之外,没有其他方法可以访问这些对象。但这并不是真正的限制。你可以(几乎)用变量名做所有你能做的事情,也可以引用 variable/object.

先从术语说起:你所谓的“anonymous”在C++语言中其实就是“temporary”。临时 variables/objects/instances 是隐式声明为 C++ 表达式的一部分,但未显式分配给变量的那些。

例如,在您的代码片段中,“3 * x”将是一个临时值。临时表达式由编译器管理,因此您无法从常规 C++ 代码访问它们。如果您需要这样做,只需用您需要的临时结果声明一个变量并使用它。

话虽如此,我相信您可能不知道引用“&”在 C++ 中是如何工作的。当您在末尾声明一个带有引用符号的类型时(例如您的“const int & ref”),您是在告诉编译器“ref”是分配给 ref 的别名,在这种情况下,别名是“3 * x + 1”。您的代码片段之所以有效,是因为您将该引用声明为“const”,因此编译器可以将“const int&”视为常规“const int”,并在需要的地方使用计算值。

但是,如果您删除“const”,您会发现您的代码无法编译。发生这种情况是因为没有“const”,您声明的是常规引用,根据定义可以更改。但是,由于您将临时表达式的结果分配给它(当然不能更改,因为它是临时的)并且它没有预先确定的存储,编译器发现引用的错误用法。