Учитывая следующее:
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?
{
}
};
Поскольку порядок оценки параметров в С++ не указан, мне интересно, если строка
basic_foo( make_what_string( id ), std::move( id ) )
в приведенном выше коде.
Я знаю, что std::move
- не что иное, как литье, но когда std::string
переместить 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);
что является недопустимым. Обратите внимание, что в обоих случаях заказ является "неожиданным", один.