Tôi đang cố gắng hiểu các tham chiếu rvalue
. Tôi đã thấy cách thức chúng được sử dụng trong nhà xây dựng, với những thứ như std::move
và std::forward
, nhưng tôi vẫn không hiểu tại sao điều này không làm việc:C++, tham chiếu rvalue trong tham số chức năng
void func(string&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
Và điều này:
template<typename T>
void func(T&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
Tại sao nó có hoạt động với phiên bản mẫu chức năng không?
Phiên bản thứ hai hoạt động vì 'T' được suy ra là' chuỗi & '."Khi kiểu tham số hàm có dạng T && trong đó T là một tham số mẫu, và đối số hàm là một giá trị của loại A, loại A & được sử dụng để khấu trừ đối số mẫu." Sử dụng 'std :: move' nếu bạn muốn cái cũ hoạt động. –
Đây là trường hợp đặc biệt của việc khấu trừ mẫu, ở đây (và chỉ ở đây AFAIK), 'T' có thể được suy ra theo kiểu tham chiếu. Thông thường trong việc khấu trừ kiểu mẫu 'T' chỉ được suy luận như là một tham chiếu không. –
có thể trùng lặp của [Cú pháp cho các tham chiếu chung] (http://stackoverflow.com/questions/14302849/syntax-for-universal-references) –