在有效STL项目22中,Meyers似乎暗示向T&
施放T
实例化临时;
T x;
T& y = x;
((T)(y)).doSomething();
导致doSomething()
在临时而不是x
上完成。
为什么演员必须是暂时的?
答案 0 :(得分:7)
为什么演员必须是临时的?
根据标准,(T)(y)
构造T
类型的临时值。
使用强制表示法进行显式类型转换的行为在C ++ 11标准中描述如下:
5.4显式类型转换(强制转换符号)
1表达式
(T)
cast-expression 的结果是T
类型。如果T
是左值引用类型或对函数类型的右值引用,则结果为左值;如果T
是对象类型的右值引用,则结果为x值;否则结果就是prvalue。
在你的情况下,
T
不是左值参考
T
不是函数类型的右值引用
T
不是对象类型的右值引用。
因此,结果是T
类型的prvalue。
如果你仔细研究prvalue和rvalue的定义(3.10节),结果就是一个临时对象。
临时对象使用显式类型转换(功能表示法)构建。
从C ++ 11标准(强调我的):
5.2.3显式类型转换(功能表示法)
1 简单类型说明符(7.1.6.2)或 typename-specifier (14.6),后跟带括号的表达式列表 在给定表达式列表的情况下构造指定类型的值。
答案 1 :(得分:3)
让我们考虑一下这段代码:
((T)(y)).doSomething();
此处 C风格的施放(T)(y)已应用。
在这种情况下,编译器基本上会从 T& 执行 static_cast 到 T (详见here)。
现在来自 cppreference.com static_cast:
static_cast< new_type> (表达)
...
1)如果从表达式到隐式转换序列 new_type,... then static_cast(expression)返回 虚数变量Temp初始化,好像是new_type 温度(表达);
从 T& 隐式转换为 T ,因此临时由 static_cast 创建。