考虑到以下几点:
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);
这是无效的。请注意,在这两种情况下,订单都是“意外”订单。