2016-12-25 2 views
1

参照を必要とする関数に右辺値を渡すことができますか?C++、なぜlvalueを引数として左辺参照をとる関数に渡すことができます

void func(const std::string& x) 
{ 
    std::cout << x << std::endl; 
} 

int main() 
{ 
    std::string& x = "Test"; //fails to compile 
    func("Test"); //works 
    return 0; 
} 

私はfuncを呼び出す前に文字列変数を作成する必要があると考えました。

std::string tmp = "Test"; 
func(tmp); 

参照を作成するのに必要なのとほとんど同じです。

std::string tmp = "Test"; 
std::string& x = tmp; 
+3

私はあなたが意味するものを得ることができません。 'std :: string&'と 'const std :: string&'は同じものではありません。 – songyuanyao

答えて

7

それがconst対象にされてlvalue参照のことだ、関数に渡すことについてではありません。

std::string& x = "Test"; //fails to compile 

上記は、非const参照に一時的なバインドを試みます。我々はそれを微調整した場合、うまく形成されるだろう:参照がスコープ外になるまで、C++標準で義務付けられて

std::string const& x = "Test"; // compiles 

が今では、一時的の寿命を延ばします。それは非const参照によって受け入れるので、今の機能パラメータは、一時的なオブジェクトにバインドすることはできません

void func(std::string& x) 

:これを知っ
、私たちはあなたの関数がにプロトタイプを変更することで、同様のコンパイルに失敗することができます。


ポストC++ 11歳の場合、物事はもう少し面白いです。テンポラリを非const 参照にバインドすることができます。

std::string&& x = "Test"; //Okay and still extends the lifetime of the temporary 
関連する問題