【问题标题】:operator+() choose rvalue reference variation instead of const lvalue variationoperator+() 选择右值参考变量而不是 const 左值变量
【发布时间】:2013-03-23 07:45:25
【问题描述】:

我试图了解以下代码中发生了什么。 它只是增加了 2 std::array,我假设输出是:

C1 = 常量 C1& + 常量 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;
}

【问题讨论】:

    标签: c++ templates operators move-semantics


    【解决方案1】:

    &amp;&amp; 用于模板参数时,如果参数是左值,会折叠成&amp;,所以最后的定义变成了

    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

    【讨论】:

    • @Chameleon 老实说,听起来您需要重新考虑您的策略,创建一个可能匹配每种类型的operator+ 听起来像是在自找麻烦。在std::arrays 的上下文中定义模板参数将消除引用折叠。还有一个事实是,将两个数组加在一起本身就是一件奇怪的事情,如果我遇到这段代码,如果不看定义,我真的无法知道它做了什么,你是在添加元素吗一起?您是否返回一个新数组,其中一个数组附加到另​​一个数组?
    • 直到现在我一直在使用class DenseVector : public container&lt;arithmetic&gt;,我尝试了一些新的东西,直接使用容器。正如 cmets(在代码中)所说,container&lt;arithmetic&gt; 在命名空间中像密集向量一样使用,所以添加 array&lt;double,5&gt; + vector&lt;double&gt; 是可以的(具有相等大小的断言)。
    • 这通常使用迭代器来完成,这里有一个例子pastebin.com/YTGcYbbr
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多