2016-11-30 4 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'를 사용한 귀하의 예제는 비표준 Visual 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&를 입력하는 번거 로움을 절약합니다.