私は3つの関数呼び出しを扱う必要があります。私は3つのうちの1つがコンパイルされない理由を理解しようとしています(g ++ -std = C++ 0x)。それが答えだ場合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、 の線に沿って少しですが、私の謝罪は、私はそれを蒸留することができませんでした。
私が望むのは、任意の種類の文字列で関数bar()を呼び出して動作させることです。 void barR(const string &x)
を定義するだけで十分ですが、なぜそれなら理解したいと思います。
3回目の呼び出しが異なる理由を理解してくれてありがとうございました。
*定数*右辺値の参照では、何も役に立たないことに注意してください。通常、 'bar(std :: string &&)'を宣言したいと思うでしょう。 –
@KerrekSB - 良い点 – jma