首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么转换类型T& to T创建一个临时类型?

为什么转换类型T& to T创建一个临时类型?
EN

Stack Overflow用户
提问于 2016-12-06 19:15:29
回答 2查看 115关注 0票数 2

在有效的STL第22项中,Meyers似乎暗示将T&转换为T实例化一个临时的;即

代码语言:javascript
复制
T x;
T& y = x;
((T)(y)).doSomething();

结果是doSomething()是在临时的而不是x上完成的。

为什么演员必须是临时的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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),加上括号大小的表达式列表,将构造给定表达式列表的指定类型的值。

票数 7
EN

Stack Overflow用户

发布于 2016-12-06 19:39:17

让我们考虑一下这段代码:

代码语言:javascript
复制
((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创建的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41003088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档