Tôi có ba cuộc gọi chức năng mà tôi nghĩ rằng cần được xử lý (về) như nhau, nhưng rõ ràng là không. Tôi đang cố gắng hiểu tại sao một trong ba không biên dịch (g ++ -std = C++ 0x).nhầm lẫn ràng buộc rvalue trong C++
// Minimal example to reproduce a compile bug I want to understand.
#include <iostream>
#include <string>
using namespace std;
void bar(const string &&x) { cout << "bar: " << x << endl; }
string returns_a_string() { return string("cow"); }
int main(int argc, char *argv[])
{
bar(string("horse")); // ok
bar(returns_a_string()); // ok
string aardvark = "aardvark";
bar(aardvark); // not ok, fails to compile, error in next comment
/*
rvalue-min.cpp:29:22: error: cannot bind ‘std::string {aka std::basic_string<char>}’ lvalue to ‘const string&& {aka const std::basic_string<char>&&}’
rvalue-min.cpp:10:6: error: initializing argument 1 of ‘void barR(const string&&)’
*/
}
Câu hỏi này là một chút dọc theo dòng của C++0x rvalue references - lvalues-rvalue binding, nhưng, nếu nó trả lời đó, lời xin lỗi của tôi, tôi đã không thể cất nó ra.
Điều tôi muốn là có thể gọi cho thanh chức năng của mình() với bất kỳ loại chuỗi nào và chỉ hoạt động. Đủ để xác định void barR(const string &x)
, nhưng tôi thực sự muốn hiểu tại sao.
Cảm ơn bạn đã giúp đỡ nhiều trong việc hiểu tại sao cuộc gọi thứ ba lại khác.
Lưu ý rằng bạn không thể thực sự làm bất kỳ điều gì hữu ích với tham chiếu rvalue * constant *. Thông thường bạn muốn khai báo 'bar (std :: string &&)'. –
@KerrekSB - điểm tốt – jma