在有效的STL第22项中,Meyers似乎暗示将T&转换为T实例化一个临时的;即
T x;
T& y = x;
((T)(y)).doSomething();结果是doSomething()是在临时的而不是x上完成的。
为什么演员必须是临时的呢?
发布于 2016-12-06 19:31:57
为什么演员必须是临时的呢?
根据标准,(T)(y)构造T类型的临时值。
使用强制转换表示法的显式类型转换的行为在C++11标准中描述如下:
5.4显式类型转换(强制表示法) 1
(T)转换表达式的结果为T类型。如果T是lvalue引用类型或函数类型的rvalue引用,则结果是lvalue;如果T是对对象类型的rvalue引用,则为xvalue;否则,结果是prvalue。
在你的情况下
T不是一个值引用。
T不是函数类型的rvalue引用。
T不是对对象类型的rvalue引用。
因此,结果是T类型的prvalue。
如果进一步研究prvalue和rvalue的定义(第3.10节),则结果是一个临时对象。
临时对象是使用显式类型转换(函数符号)构造的。
来自C++11标准(强调地雷):
5.2.3显式类型转换(函数表示法) 1简单类型说明符(7.1.6.2)或类型名称说明符(14.6),加上括号大小的表达式列表,将构造给定表达式列表的指定类型的值。
发布于 2016-12-06 19:39:17
让我们考虑一下这段代码:
((T)(y)).doSomething();这里采用C型铸造(T)(y) .
基本上,编译器在这种情况下执行从T&到T的static_cast (详细信息请参阅这里 )。
现在来自cppreference.com 投射
static_cast < new_type >(表达式) ..。 1)如果有从表达式到new_type的隐式转换序列,.然后,static_cast(表达式)返回虚变量Temp,该变量初始化为new_type Temp(表达式);
有一个从T&到T的隐式转换,所以临时是由static_cast创建的。
https://stackoverflow.com/questions/41003088
复制相似问题