【问题标题】:casting to the same type铸造成相同的类型
【发布时间】:2016-08-17 05:40:35
【问题描述】:

我有这种情况:

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,则强制转换是多余的。

按照标准,由于没有必要,是否会丢弃第二次强制转换(不再有可执行代码)?

【问题讨论】:

  • 基于this answer,不清楚你说的dropped是什么意思。
  • 如果删除意味着它不会产生可执行代码,那么是。基于链接到的答案 merlin
  • 怎么样classB x = a;
  • 标准没有说明会生成多少条汇编指令。如果你在乎,那就衡量吧。
  • N3690: 5.2.9/4: 如果声明 T t(e); 格式正确,则表达式 e 可以使用 static_cast&lt;T&gt;(e) 形式的 static_cast 显式转换为类型 T,对于一些发明的临时变量 t (8.5)。 这种显式转换的效果与执行声明和初始化,然后使用临时变量作为转换的结果是一样的。当且仅当初始化使用它作为一个glvalue时,表达式e才被用作一个glvalue。 --------- 从这一点来看,这样的static_cast似乎会将我们置于编译器的(优化)怜悯。

标签: c++ c++11 static-cast


【解决方案1】:

来自 C++11 标准:

5.2.9 静态转换

1 表达式static_cast&lt;T&gt;(v) 的结果是将表达式v 转换为类型T 的结果。

v 的类型与T 相同时,T 不是类时转换简单。一个体面的编译器不应该static_cast的这种用法生成任何可执行代码。

【讨论】:

  • 我认为这是错误的,static_cast 应该调用复制构造函数。 Example。参见 5.2.9/4(在 C++14 中)
  • 那为什么在@M.M,例如,复制构造函数被调用?
  • 这个one
  • @RSahu ideone.com/PLt54x - 由于删除了 static_cast 的复制构造函数而无法编译。
  • cppreference的第一段中,在解释中指出:“static_cast(expression) 返回虚拟变量 Temp 初始化为 new_type Temp(expression);”
猜你喜欢
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
相关资源
最近更新 更多