我有一个结构模板,它需要两种类型(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);
)。 - Jonathan Potterstd::string
这样的复杂类型,这也是真的吗?例如,如果some_other_function
的参数是const std::string&
,它是否保证传递对val
的引用,而不是val
的临时副本? - maracksome_other_function
、bar
等并通过值传递。而不是来自于static_cast
本身。 - Jonathan Pottert2 = static_cast<T>(t1)
首先调用一个拷贝构造函数(以创建一个未命名的临时变量),然后再调用赋值运算符,当所有东西都是类型T
时。这与t2 = t1
不同(它只调用赋值运算符)。实际上,标准规定static_cast<T>(t1)
等同于声明T temp(t1)
,(其中temp
实际上是一个未命名变量),并且该表达式的值为temp
。 - Nick Matteo