類來進行測試:爲什麼不能自動替換此副本?
#include <iostream>
#include <string>
struct inner
{
std::string value;
inner() : value("test") {
std::cerr << "inner default construct\n";
}
inner(inner &&mv) : value(std::move(mv.value)) {
std::cerr << "inner move construct\n";
}
inner(inner const ©) : value(copy.value) {
std::cerr << "inner copy construct\n";
}
};
struct outer
{
inner value;
outer() {}
outer(inner v)
: value(v)
{}
};
移動語義的一個簡單的測試做什麼,我預計:
inner mover(inner x)
{
return x;
}
int main()
{
inner i;
auto q = mover(std::move(i));
return 0;
}
...它輸出:
內默認的構造
內動構造
內移動構建
但這主要做一些事情我沒有想到:
int main()
{
inner i;
outer o(std::move(i));
return 0;
}
內默認的構造
內移動構建
內拷貝構造
我期待複製是另一個舉動,因爲它在第一個主要。爲什麼優化在第一種情況下可用,而在第二種情況下不可用?
我意識到我可以明確地調用std :: move在outer(inner v)
構造函數....但爲什麼這是必需的?爲什麼編譯器不能做隱式的移動?
你可以移動到一個參數值 – aaronman
右,當輸入的內部實例被創建並傳遞給外部構造函數之前,它將解釋內部構造信息。但在該構造函數內部,'inner v'參數是一個左值,而不是右值。由於左值不能綁定到右值引用,所以'outer :: v'成員不能通過'inner'移動構造函數初始化,只能使用複製構造函數,因此是'inner copy construct'消息。 –