我通過故意試圖破壞事情來測試我對左值和右值引用的理解。所以說有這個結構:存儲右值引用:應該工作嗎?
struct FooBar
{
FooBar(int&& number) : rNumber(number)
{
}
int& rNumber;
};
我創建一個實例FooBar obj(5)
。每次嘗試讀取引用變量都會返回正確的結果(5)。如果我使用const int&
而不是int&&
,則會發生同樣的情況。
我注意到用std::string
代替int
並且讀引用返回一個空字符串,所以我懷疑它給出了未定義的行爲。這是嗎?如果是這樣,爲什麼它使用整數?
更新:我創建的實例,並閱讀它是這樣的:
FooBar obj(5);
//FooBar obj("Hello"); // For strings...
std::cout << obj.rNumber << std::endl;
更新2:如果你傳遞一個用戶定義類型,這樣它也適用:
struct GooBar
{
public:
GooBar(int number) : itsNumber(number)
{
std::cout << "In constructor..." << std::endl;
}
GooBar(const GooBar& rhs) = delete;
GooBar(GooBar&& rhs) = delete;
~GooBar()
{
std::cout << "In destructor..." << std::endl;
}
int itsNumber;
};
struct FooBar
{
FooBar(GooBar&& number) : rNumber(number)
{
}
GooBar& rNumber;
};
,然後創建一個實例,並閱讀它,像這樣:
FooBar obj(GooBar(5));
std::cout << obj.rNumber.itsNumber << std::endl;
我覺得這很有趣,因爲它提供了以下的輸出:
In constructor...
In destructor...
5
這確實是未定義的行爲,您是否啓用了警告進行編譯? (例如,clang'-Weverything') –
如果我啓用所有警告,我會得到~700個警告,所以如果有任何與未定義行爲有關的行爲,我不能立即指出。至少源於我的源文件的警告並不存在,但在庫文件中還有其他警告。我在MSVC btw。 –
嗯,我很抱歉你選擇的編譯器:(順便說一下,它不適合你的用戶類型;你可以通過在'GooBar'析構函數中將'itsNumber'設置爲'0'來展示它。 –