operator +()选择rvalue reference variation而不是const lvalue variation

时间:2013-04-02 05:40:00

标签: c++ templates operators move-semantics

我正在尝试了解以下代码中发生的情况。 它只增加了2 std::array,我假设输出为:

  

C1 = const C1& + const C2&

取而代之的是:

  

C1&安培;&安培; = C1&& + C2&&

显然,ararr不是暂时的。

这里有什么问题,我该如何解决?

#include <iostream>
#include <array>
using namespace std;

template<typename C1, typename C2>
C1//inline typename std::enable_if<is_densevector<C1>::value && is_densevector<C2>::value, C1>::type
operator+(const C1 &v1, const C2 &v2) { cout << "C1 = const C1& + const C2&" << endl; C1 r; return r; }
template<typename C1, typename C2>
C2//typename std::enable_if<is_densevector<C1>::value && is_densevector<C2>::value, C2>::type
&&operator+(const C1 &v1, C2 &&v2) { cout << "C2&& = const C1& + C2&&" << endl; return v2; }
template<typename C1, typename C2>
C1//inline typename std::enable_if<is_densevector<C1>::value && is_densevector<C2>::value, C1>::type
&&operator+(C1 &&v1, const C2 &v2) { cout << "C1&& = C2&& + const C2&" << endl; return v1; }
template<typename C1, typename C2>
C1//inline typename std::enable_if<is_densevector<C1>::value && is_densevector<C2>::value, C1>::type
&&operator+(C1 &&v1, C2 &&v2) { cout << "C1&& = C1&& + C2&&" << endl; return v1; }

int main()
{
    std::array<double,3> ar{1,2,3}, arr{3,2,1};
    ar + arr;
    return 0;
}

1 个答案:

答案 0 :(得分:2)

&&用于模板参数时,如果参数为左值,则会折叠为&,因此最后一个定义变为

template<typename C1, typename C2>
C1& operator+(C1& v1, C2& v2);

编译器会优先于

template<typename C1, typename C2>
C1 operator+(const C1 &v1, const C2 &v2)

(或任何其他人),因为您的数组不是const