Ho tre chiamate di funzione che, a mio avviso, dovrebbero essere considerate uguali, ma chiaramente non lo sono. Sto cercando di capire perché uno dei tre non compila (g ++ -std = C++ 0x).confusione vincolo valore in 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&&)’
*/
}
Questa domanda è un po 'lungo le linee di C++0x rvalue references - lvalues-rvalue binding, ma, se è risposto lì, le mie scuse, non è stato in grado di distillare fuori.
Quello che voglio è essere in grado di chiamare la mia barra delle funzioni() con qualsiasi tipo di stringa e farlo funzionare. È sufficiente definire void barR(const string &x)
, ma mi piacerebbe davvero capire perché.
Grazie mille per l'aiuto nel capire perché la terza chiamata è diversa.
Si noti che non si può realmente fare nulla di utile con un riferimento di * costante * rvalore. In genere si vorrebbe dichiarare 'bar (std :: string &&)'. –
@KerrekSB - buon punto – jma