我必须处理一些我试图破译的高度模板化的代码。
我看到两种不同的结构,我不确定我是否遗漏了什么。这是一些地方使用的这些类型转换的简化示例,以下语句之间有区别吗?
template<typename T, typename S> S my_function(T t)
{
// version 1:
S s = t
return s;
// version 2:
return S(t);
}
我正在考虑将所有内容更改为一种样式,这两个语句是否 100% 等效?如果不是,有什么区别?
最佳答案
不,它们不是 100% 等效的!
对于简单的情况(c++11 及更高版本),考虑类型为 class S
的 return 语句,那么区别是:
如果 S
有 move operators然后在返回值时使用它们,否则 copy operators被使用。另请注意,如果这些运算符是私有(private)的或已删除,则版本 1 将无法编译。
对于版本 2 s
创建(使用构造函数或用户定义的运算符)并由于 RVO 直接返回
现在对于复杂的情况,还有其他的事情要考虑;第一个版本使用 copy initialization第二个是 direct initialization .还有user defined operators和 explicit可以改变行为的关键字。
关于c++ - 这两种转换方式有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48540924/