我讀過有關& &幾張紙,我只是好奇,如果有:R值裁判和完美轉發
void fnc_1(int&& p)
{
//...
}
void fnc(int&& r)
{
fnc_1(r);//am I suppose to/should I? call it like so:fnc_1(std::forward(r))
}
或只是路過「R」是不夠嗎?
我讀過有關& &幾張紙,我只是好奇,如果有:R值裁判和完美轉發
void fnc_1(int&& p)
{
//...
}
void fnc(int&& r)
{
fnc_1(r);//am I suppose to/should I? call it like so:fnc_1(std::forward(r))
}
或只是路過「R」是不夠嗎?
std::forward
模板通常用於依賴類型。請仔細閱讀this question,看看它是否適用於此。這是一個難以掌握的主題,所以請隨時更新您的問題,並提供有關您確切問題的相關細節(使用整數的右值引用並不令人興奮......)。
我相信你的問題是關於右值引用的基本屬性的理解。經驗法則是:
&&
的類型綁定到右值。如果你有一個函數...
void foo(SomeClass&& x)
{
// ... then here x has type SomeClass& !
}
然後身體裏面,x
是出了名的,因此一個升值。它確實有類型SomeClass&
。您必須使用std::move
把一個SomeClass&
到SomeClass&&
:
void bar(SomeClass&& x)
{
// Since `x` has a name here, it is a Lvalue.
// Therefore it has type SomeClass&, what the signature doesn't indicate.
// We thus have to explicitly turn it into a rvalue:
foo(std::move(x));
}
是不是程序生病了,因爲在C++中不允許引用引用? –
@Alex我只是作爲一個例子鍵入int,在我的代碼中它是一個類模板 – smallB
@Als:這不是對引用的引用,它是* rvalue引用*(來自未來C++標準的東西)。 –
fnc_1(r)
不會編譯,因爲r
是一個左值,就像任何其他變量,無論其類型。是的,沒錯,名爲右值的引用是左值,而不是右值。
fnc_1(std::forward(r))
也不會編譯,因爲std::forward
是專門設計不推斷其模板參數。
要通過一個右值,下面的任一會的工作:
fnc_1(std::move(r))
fnc_1(std::forward<int&&>(r))
fnc_1(std::forward<int>(r))
使用std::move
是投一個左到右值的慣用方式,所以我會建議使用。
,當然舊的'static_cast
是您的第一個功能'fnc_1'?如果不是,我們應該看到它:它的簽名問題。 –