转换为相同类型

9

我有这样一个案例:

using T = classA; //T could be classA and could be `classB` in other platforms.
T a;
auto x = static_cast<classB>(a);

如果 T 是 classA,则必须进行转换。 如果 T 是 classB,则转换是多余的。

按照标准,第二个转换会被删除(不再有可执行代码),因为它是不必要的吗?


1
根据这个答案,不清楚你所说的“dropped”是什么意思。 - merlin2011
如果你所说的“dropped”是指没有生成可执行代码,那么是的。这是基于merlin提供的答案。 - StoryTeller - Unslander Monica
1
classB x = a; 怎么样? - M.M
1
标准并未说明会生成多少汇编指令。如果您关心,那就进行测量。 - Brian Bi
1
N3690: 5.2.9/4:如果存在一个虚构的临时变量t(8.5)使得声明T t(e);是合法的,则表达式e可以使用形如static_cast<T>(e)的静态转换被显式转换成类型T。这种明确的转换的效果就像声明和初始化,然后使用临时变量作为转换结果一样。只有在初始化使用它作为glvalue时,表达式e才会被用作glvalue。 ------ 从这里看来,这样的static_cast将取决于编译器的(优化)处理。 - iammilind
显示剩余7条评论
1个回答

3

根据C++11标准:

5.2.9 静态转换

1 表达式 static_cast<T>(v) 的结果是将表达式 v 转换为类型 T 的结果。

v 的类型与 T 相同时,如果 T 不是一个类,则转换很简单。对于这种用法,一个良好的编译器不应该生成任何可执行代码。


7
我认为这是错误的,static_cast 应该调用复制构造函数。示例。参见5.2.9/4(在C++14中)。 - M.M
那么为什么在@M.M的例子中会调用复制构造函数呢? - Pumkko
这个链接是关于编程的内容。 - Pumkko
2
@RSahu http://ideone.com/PLt54x - 由于删除了 static_cast 的复制构造函数,无法编译。 - Holt
1
cppreference 的第一个段落中,解释说:"static_cast<new_type>(expression) 返回一个虚拟变量 Temp,其初始化方式类似于 new_type Temp(expression);"。 - Pumkko
@Pumkko - 在cppreference中,第一个段落的解释中说:“static_cast<new_type>(expression)返回一个名为Temp的虚拟变量,其初始化方式就像new_type Temp(expression);一样。”这是否意味着Temp对象真的被创建了? - user15676138

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接