Путаница с привязкой rvalue в C ++

У меня есть три вызова функций, которые, как мне кажется, должны обрабатываться (примерно) одинаково, но, очевидно, это не так. Я пытаюсь понять, почему один из трех не компилируется (g ++ -std = c ++ 0x).

// Minimal example to reproduce a compile bug I want to understand.

#include 
#include 

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}’ lvalue to ‘const string&& {aka const std::basic_string&&}’
      rvalue-min.cpp:10:6: error:   initializing argument 1 of ‘void barR(const string&&)’
    */
}

Этот вопрос немного похож на C ++ 0x ссылки rvalue - привязка lvalues-rvalue , но, если он там ответил, мои извинения, я не смог выделить его.

Я хочу иметь возможность вызывать свою функциональную панель () с любой строкой, и она просто работает. Достаточно определить void barR (const string & x) , но мне бы очень хотелось понять, почему.

Большое спасибо за любую помощь в понимании того, почему третий звонок отличается.

8
задан Community 23 May 2017 в 10:30
поделиться