为什么要铸造T&给T创建一个临时的?

时间:2016-12-06 19:15:30

标签: c++ casting reference

在有效STL项目22中,Meyers似乎暗示向T&施放T实例化临时;

T x;
T& y = x;
((T)(y)).doSomething();

导致doSomething()在临时而不是x上完成。

为什么演员必须是暂时的?

2 个答案:

答案 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 创建。