У меня есть три вызова функций, которые, как я думаю, следует рассматривать (примерно) одинаково, но ясно, что это не так. Я пытаюсь понять, почему один из трех не компилирует (g ++ -std = C++ 0x).rvalue binding confusion в 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++0x rvalue references - lvalues-rvalue binding, , но, если он ответил там, мои извинения, я не смог отогнать его.
Я хочу, чтобы иметь возможность вызывать мою функциональную панель() с любой строкой, и она просто работает. Достаточно определить void barR(const string &x)
, но я бы очень хотел понять, почему.
Большое спасибо за помощь в понимании того, почему третий звонок отличается.
Обратите внимание, что вы не можете делать ничего полезного с помощью ссылки * константы * rvalue. Обычно вы хотите объявить 'bar (std :: string &&)'. –
@KerrekSB - хорошая точка – jma