Xét sau:Move ngữ nghĩa & tranh luận để đánh giá
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?
{
}
};
Vì đơn đặt hàng đánh giá tham số trong C++ là không xác định, tôi tự hỏi nếu dòng
basic_foo(make_what_string(id), std::move(id))
trong mã trên là hợp lệ.
Tôi biết rằng std::move
không có gì khác ngoài dàn diễn viên, nhưng khi nào lệnh std :: string di chuyển ctor được thực thi? Sau khi tất cả các đối số đã được đánh giá và đã đến lúc gọi hàm tạo cơ sở? Hoặc là điều này được thực hiện trong quá trình đánh giá các tham số? Trong Nói cách khác:
Liệu trình biên dịch thực hiện điều này:
std::string &&tmp2 = std::move(id);
std::string tmp1 = make_what_string(id);
basic_foo(tmp1, tmp2);
đó là hợp lệ. Hoặc điều này:
std::string tmp2 = std::move(id);
std::string tmp1 = make_what_string(id);
basic_foo(tmp1, tmp2);
không hợp lệ. Lưu ý rằng trong cả hai trường hợp, thứ tự là "bất ngờ" .
Thực ra, mã này hợp lệ. Tuy nhiên, tôi tin rằng bạn có nghĩa là để có chuỗi 'id' trong constructor' base_foo' bởi tham chiếu rvalue chứ không phải bởi giá trị (không bạn?). –
@CassioNeri, Không có mã như dự định :) – Tom
Vâng, tôi nhận ra rằng trong giờ ăn trưa. :-) Câu hỏi rất hay. –