【发布时间】:2013-10-07 01:27:00
【问题描述】:
我有一个结构模板,它采用两种类型(T 和S),并且在某些时候使用static_cast 从一种类型转换为另一种类型。很多时候T 和S 是同一个类型。
设置的简化示例:
template <typename T, typename S = T>
struct foo
{
void bar(T val)
{
/* ... */
some_other_function(static_cast<S>(val));
/* ... */
}
};
如果S 与T 是同一个类,static_cast 是否或是否会引入额外的开销,或者它是一个始终会被忽略的空操作?
如果确实引入了开销,是否有一个简单的模板元编程技巧仅在需要时执行static_cast,还是我需要创建部分专业化来处理T == S 情况?如果可能,我宁愿避免整个foo 模板的部分特化。
【问题讨论】:
-
不会有任何开销,如果它们是相同的类型,它将是空操作(类似于
int a = 5; int b = static_cast<int>(a);) -
即使对于像
std::string这样的复杂类型也是如此吗?例如,如果some_other_function的参数是const std::string&,是否保证传递对val的引用而不是val的临时副本? -
@JonathanPotter:不幸的是,这只是错误的。我检查了g++ 5.3、g++ 6.1和clang++ 7.3,它们都调用了复制构造函数来为static_cast构建一个临时对象到相同的类型。
-
@Kundor 在上面(和下面)的例子中,复制构造函数将来自调用
some_other_function、bar等并按值传递。不是来自static_cast本身。 -
@JonathanPotter: 不。
t2 = static_cast<T>(t1)首先调用一个复制构造函数(以创建一个未命名的临时对象),然后调用赋值运算符,当一切都是T类型时。它与t2 = t1不同(它只是调用赋值运算符。)事实上,标准规定static_cast<T>(t1)与声明T temp(t1)相同,(其中temp实际上是一个未命名的变量)并且表达式具有值temp。
标签: c++ overhead static-cast