我必须处理一些我试图破译的模板化程度很高的代码。
我看到两种不同的结构,我不确定我是否遗漏了一些东西。以下是在某些地方使用的这些类型转换的简化示例,以下语句之间是否存在差异?
template<typename T, typename S> S my_function(T t)
{
// version 1:
S s = t
return s;
// version 2:
return S(t);
}
我正在考虑将所有内容改为一种风格,这两种说法是否100%相等,如果没有,有什么区别?
答案 0 :(得分:3)
不,它们不是100%相同!
对于简单的情况(c ++ 11及更高版本),考虑类型为class S
的return语句,则区别为:
如果S
有move operators,那么在返回值时会使用它们,否则会使用copy operators。另请注意,如果这些运算符是私有的或已删除,则版本1将无法编译。
对于版本2 s
已创建(使用构造函数或用户定义的运算符)并由于RVO而直接返回
现在对于复杂的案例,还有其他事情需要考虑;第一个版本使用copy initialization,第二个版本使用direct initialization。还有user defined operators和explicit关键字可以改变行为。
答案 1 :(得分:1)
版本1和版本2分别称为copy initialization(表单1)和direct initialization(表单3)。差异取决于T
和S
之间的关系。
执行复制初始化(表单4)的return
语句的效果取决于S
的性质。区别在于s
是l值,而S(t)
是r值。 Copy elision也可能适用于此处。对于班级类型,这可能会有所不同。