功能可以說我有以下簡單的Vector類:「雙師型」 與的C++ 0x
template <class N>
class Vector<N>
{
public:
std::array<int, N> a;
};
我在double
第一次嘗試如下:
template <class N>
Vector<N>&& double1(Vector<N>&& x)
{
for (int i = 0; i != N, ++i) { x.a[i] *= 2; }
return static_cast<Vector<N>&&>(x);
}
這看起來確定最初,但如果我這樣做:
auto x&& = double1(makeVector(1,2,3))
我不得不臨時問題的引用。
我的第二次嘗試以下操作:
template <class N>
Vector<N> double2(Vector<N>&& x)
{
for (int i = 0; i != N, ++i) { x.a[i] *= 2; }
return x;
}
這似乎沒有上面提到暫時性的問題,但確實我認爲是多此一舉/複製的回報。
我可以同時避免參照臨時問題,並通過做額外的移動/複製以下:
template <class N>
void double3(Vector<N>& x)
{
for (int i = 0; i != N, ++i) { x.a[i] *= 2; }
}
但後來我不得不做出改變的說法,我認爲這是一個有點亂。我還必須給臨時名稱命名。
我最終的想法是以下幾點:
template <class N>
Vector<N> double4(Vector<N> x)
{
for (int i = 0; i != N, ++i) { x.a[i] *= 2; }
return x;
}
,它能夠避免所有副本,如果參數存儲在同一個地方的結果,但我不知道如何做到這一點。
基本上我正在尋找具有以下特性的雙重功能:
(1)當自動分配給臨時問題無法引用。 (2)臨時通過時沒有副本。 (3)傳遞非臨時性時不修改參數。
任何人都有任何想法如何把這三樣東西放在一起?
編輯
也許把事情更簡單地說,這就是我想要的行爲。
(1)如果參數是臨時參數,則將其修改到位。
(2)否則,複製一份。
我懷疑這是可能的。您不能在臨時通過時不進行復制,仍然使用結果。你也不能讓它在通過非臨時性時不修改參數,也不能使其成爲副本。 –
不要編寫返回右值引用的函數。一個普通的舊參考有什麼問題?爲什麼在第一次嘗試時,你實際上已經準備好「移動」你的論點,然後將它重新分配給另一個變量,那麼改變論證「混亂」? –
另外,這裏的任何一點是什麼,你的類不包含任何類型的資源處理程序,甚至可以從移動語義中受益。 –