Tại sao đoạn mã sau hợp lệ:Tại sao chức năng chuyển tiếp hoàn hảo phải được tạo mẫu?
template<typename T1>
void foo(T1 &&arg) { bar(std::forward<T1>(arg)); }
std::string str = "Hello World";
foo(str); // Valid even though str is an lvalue
foo(std::string("Hello World")); // Valid because literal is rvalue
Nhưng không:
void foo(std::string &&arg) { bar(std::forward<std::string>(arg)); }
std::string str = "Hello World";
foo(str); // Invalid, str is not convertible to an rvalue
foo(std::string("Hello World")); // Valid
Tại sao không phải là giá trị trái trong ví dụ 2 được giải quyết trong cùng một cách thức mà nó trong ví dụ 1?
Ngoài ra, tại sao tiêu chuẩn cảm thấy cần phải cung cấp loại đối số trong std :: forward so với simple deducing it? Chỉ cần gọi về phía trước là hiển thị ý định, bất kể loại nào.
Nếu đây không phải là một điều tiêu chuẩn và chỉ trình biên dịch của tôi, tôi đang sử dụng msvc10, điều này sẽ giải thích sự hỗ trợ C++ 11 crappy.
Cảm ơn
Sửa 1: Thay đổi chữ "Hello World" được std :: string ("Hello World") để thực hiện một rvalue.
Điều gì xảy ra trong thanh? Biên dịch không có nghĩa là nó hoạt động nhất thiết. Tôi tin rằng nó phải là 'void foo (T1 & arg)' và 'void foo (std :: string & arg)' tương ứng. – AJG85
'" Hello World "' không phải là một rvalue, nó là một lvalue với kiểu 'const char [12]'. – GManNickG
@ AJG85 Điều gì xảy ra trong quán bar không quan trọng. && có nghĩa là tham chiếu rvalue. – Mranz