考慮以下功能:值返回值時是否隱式移動值參數?
Foo foo(Foo x)
{
return x;
}
將return x
調用拷貝構造函數或轉移構造函數? (讓我們離開NRVO一邊在這裏。)
探討,我寫了一個簡單Foo
類,它是唯一可移動的,但不可拷貝:
struct Foo
{
Foo() = default;
Foo(const Foo&) = delete;
Foo(Foo&&) = default;
};
如果值返回值參數,當移動的構造被調用,所有應該沒事。但目前的G ++編譯器抱怨return x
與以下錯誤消息:
error: deleted function 'Foo::Foo(const Foo&)'
如果我更換return x
與return std::move(x)
,一切都很好。由此我得出結論,如果需要,必須明確地完成從值參數的移動。 g ++的行爲是否符合?
Upvoted。這對草案來說是一個相對較晚的變化,這就解釋了爲什麼它還沒有到處實現。 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1148 – 2011-05-15 15:04:48