为什么要将类型T&T转换为T创建一个临时的?

Mic*_*len 2 c++ casting reference

在有效的STL项目22中,迈耶斯似乎暗示T&将一个T实例化为临时的; 那是

T x;
T& y = x;
((T)(y)).doSomething();
Run Code Online (Sandbox Code Playgroud)

结果doSomething()是在临时而不是x.

为什么演员必须暂时?

R S*_*ahu 7

为什么演员必须暂时?

根据标准,(T)(y) 构造一个临时值类型T.

使用强制转换表示法的显式类型转换的行为在C++ 11标准中描述如下:

5.4显式类型转换(强制转换表示法)

1表达式(T) cast-expression的结果是类型T.结果是左值,如果T是左值引用类型或对函数类型的右值引用,则xvalue T是对象类型的右值引用; 否则结果是一个prvalue.

在你的情况下,

T不是左值参考.
T不是函数类型的右值引用.
T不是对象类型的右值引用.

因此,结果是类型的prvalue T.

如果你进一步研究prvalue和rvalue的定义(第3.10节),结果就是一个临时对象.

使用显式类型转换(功能表示法)构造临时对象.

从C++ 11标准(强调我的):

5.2.3显式类型转换(功能表示法)

1 简单类型说明符(7.1.6.2)或类型名称说明(14.6)后跟带括号的表达式列表 ,在给定表达式列表的情况下构造指定类型的值.