我有这样一个案例:
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
,则转换是多余的。
按照标准,第二个转换会被删除(不再有可执行代码),因为它是不必要的吗?
我有这样一个案例:
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
,则转换是多余的。
按照标准,第二个转换会被删除(不再有可执行代码),因为它是不必要的吗?
根据C++11标准:
5.2.9 静态转换
1 表达式
static_cast<T>(v)
的结果是将表达式v
转换为类型T
的结果。
当 v
的类型与 T
相同时,如果 T
不是一个类,则转换很简单。对于这种用法,一个良好的编译器不应该生成任何可执行代码。
static_cast
的复制构造函数,无法编译。 - HoltTemp
对象真的被创建了? - user15676138
classB x = a;
怎么样? - M.Mt(8.5)
使得声明T t(e);
是合法的,则表达式e可以使用形如static_cast<T>(e)
的静态转换被显式转换成类型T。这种明确的转换的效果就像声明和初始化,然后使用临时变量作为转换结果一样。只有在初始化使用它作为glvalue时,表达式e才会被用作glvalue。 ------ 从这里看来,这样的static_cast
将取决于编译器的(优化)处理。 - iammilind