2016-11-30 11 views
4

私が理解した理由から、変数を値への戻り値として定義すると、実際に参照にバインドされた有効期間を持つ一時オブジェクトへの参照があり、その参照はconstと宣言されていなければなりません。関数への参照値と自動返す

これは、constのように定義されていないため、次の例のa2が自動的にconstになるのはなぜですか?
非const参照をその一時オブジェクトにバインドすることができない場合は、一時オブジェクト自体をデフォルトでconstにしてください。それを非constにする理由は何ですか?

#include <string> 

std::string getStringA() 
{ 
    std::string myString = "SomeString"; 
    return myString; 
} 

const std::string getStringB() 
{ 
    std::string myString = "SomeString"; 
    return myString; 
} 


int main() 
{ 
    const std::string temp; 

    std::string &a1 = getStringA();  // std::string& a1, warning C4239 : nonstandard extension used : 'initializing' : conversion from 'std::string' to 'std::string &' 
    auto &a2 = getStringA();    // std::string& a2, warning C4239 : nonstandard extension used : 'initializing' : conversion from 'std::string' to 'std::string &' 
    const std::string &a3 = getStringA(); // all good 

    auto &b1 = getStringB();    // const std::string& b1 
    auto &b2 = temp;      // const std::string& b2 
} 
+0

'getStringA'を使用したあなたの例は、非標準のビジュアルC++拡張のためにのみ機能します。 – StoryTeller

+0

したがって、 'getStringA()'のような関数への参照を得るためには、常に 'const'を返す必要がありますか?例えば'getStringB()' – sharyex

+0

私は決して 'const'値を返すことを勧めません。私の答えを見てください。 – StoryTeller

答えて

2

あなたは、const値を返すようにしたくないので、それはkill move semanticsをでしょう。

struct A { 
    A() = default; 
    A(A&&) = default; 
    A(A const&) = delete; 
}; 

A  foo() { return {}; } 
A const bar() { return {}; } 

int main() 
{ 
    A a1 {foo()}; 
    A a2 {bar()}; // error here 
} 

そして、それはちょうど自分自身に一時的に結合するためのauto const&を入力する手間を惜しまし、支払うために価格のあまりです。

関連する問題