簡體   English   中英

運算符+()選擇右值引用變化而不是常量左值變化

[英]operator+() choose rvalue reference variation instead of const lvalue variation

我試圖了解以下代碼中正在發生的事情。 它只是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;
}

如果參數是左值, &&當用於模板參數時將折疊為& ,因此最后一個定義變為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM