这两种转换方法有区别吗?

时间:2018-01-31 11:20:28

标签: c++ templates

我必须处理一些我试图破译的模板化程度很高的代码。

我看到两种不同的结构,我不确定我是否遗漏了一些东西。以下是在某些地方使用的这些类型转换的简化示例,以下语句之间是否存在差异?

template<typename T, typename S> S my_function(T t) 
{
    // version 1:
    S s = t
    return s;

    // version 2:
    return S(t);
 }

我正在考虑将所有内容改为一种风格,这两种说法是否100%相等,如果没有,有什么区别?

2 个答案:

答案 0 :(得分:3)

不,它们不是100%相同!

对于简单的情况(c ++ 11及更高版本),考虑类型为class S的return语句,则区别为:

如果Smove operators,那么在返回值时会使用它们,否则会使用copy operators。另请注意,如果这些运算符是私有的或已删除,则版本1将无法编译。

对于版本2 s已创建(使用构造函数或用户定义的运算符)并由于RVO而直接返回

现在对于复杂的案例,还有其他事情需要考虑;第一个版本使用copy initialization,第二个版本使用direct initialization。还有user defined operatorsexplicit关键字可以改变行为。

答案 1 :(得分:1)

版本1和版本2分别称为copy initialization(表单1)和direct initialization(表单3)。差异取决于TS之间的关系。

执行复制初始化(表单4)的return语句的效果取决于S的性质。区别在于s是l值,而S(t)是r值。 Copy elision也可能适用于此处。对于班级类型,这可能会有所不同。