考慮以下內容:移動語義&參數評價順序
std::string make_what_string(const std::string &id);
struct basic_foo
{
basic_foo(std::string message, std::string id);
};
struct foo
: public basic_foo
{
foo::foo(std::string id)
: basic_foo(make_what_string(id), std::move(id)) // Is this valid?
{
}
};
因爲在C++參數評價順序是不確定的,我想知道如果 線
basic_foo(make_what_string(id), std::move(id))
在上面的代碼
是有效的。
我知道std::move
不過是一個強制轉換,但是當std :: string move ctor執行了嗎?在所有參數都被評估之後,是時候調用 的基礎構造函數了?或者是在評估參數期間完成的?在其他 話:
該編譯器做到這一點:
std::string &&tmp2 = std::move(id);
std::string tmp1 = make_what_string(id);
basic_foo(tmp1, tmp2);
這是有效的。或者這個:
std::string tmp2 = std::move(id);
std::string tmp1 = make_what_string(id);
basic_foo(tmp1, tmp2);
這是無效的。請注意,在這兩種情況下,訂單都是「意外」 之一。
其實,代碼是有效的。然而,我相信你的意思是在'base_foo'的構造函數中通過rvalue引用而不是值(不是嗎?)來獲取字符串'id'。 – 2013-03-28 11:51:55
@CassioNeri,沒有代碼是預期:) – Tom 2013-03-28 12:03:36
是的,我意識到,在午餐時間。 :-)非常好的問題。 – 2013-03-28 13:24:19