2016-06-18 9 views
6

편집 : 이것은 연결된 질문과 중복되지 않습니다. 여기에 모든 반환 유형은 std::vector입니다. 나는 에 initializer-list을 돌려주고 싶지 않습니다. 내가 initializer-list에 의해 반환 된 std::vector을 채우려 직접std :: function에서 vector 대신 이니셜 라이저 목록을 반환하십시오.

은 우리가 그 4 사례를 보자

1)

//Acceptable 
std::vector<int> foo(){ 
    return std::vector<int>{1}; 
} 

2)

//Acceptable 
std::vector<int> foo(){ 
    return {1};  
} 

3)

//Acceptable 
std::function<std::vector<int>()> foo=[](){ 
    return std::vector<int>{1}; 
}; 

4) 두 사람

//NOT Acceptable 
std::function<std::vector<int>()> foo=[](){ 
    return {1}; 
}; 
4가 허용되지 않는 이유는

허용? 그들 사이에 다른 점은 무엇입니까? 또한,이 허용하는 가장 이상한 것은 :

//Acceptable 
auto bar=[]()->std::vector<int>{ 
    return {1}; 
}; 

std::functioninitializer-list 어떤 문제가 있습니까?

+3

가능한 복제 (http://stackoverflow.com/questions/35361408/why-i-can-not-return-initializer-list-from-lambda) –

+0

전 나는이 질문에 대답했다 : 당신의 눈에는 연결된 대답이 어떻게 대답하지 않습니까? –

+0

다르다. 그 Initializer 목록을 반환에 대한 질문. 여기서 모든 경우의 리턴 타입은 벡터이다. –

답변

4

auto bar=[]()->std::vector<int>{은 람다 bar의 리턴 유형을 std::vector<int>으로 지정합니다.

std::function<std::vector<int>()> foo=[](){은 람다의 반환 유형을 먼저 추론 한 후 반환 유형을 지정하지 않으므로 foo의 반환 유형을 지정하지 않습니다.

C++은 유형을 결정할 때 람다를 할당 할 수있는 것을 고려하지 않고 std::initializer_list<int> 인 return {1}을보고 std::function<std::vector<int>>과 호환되지 않습니다.[내가 람다에서 초기화 목록을 반환 할 수없는 이유]의

1

이 변화는 컴파일 : 이것은 람다 식의 명시 적 반환 형식을 제외하고, 귀하의 경우 4와 동일

std::function<std::vector<int>()> foo=[]()->std::vector<int>{ 
    return {1}; 
}; 

. 이것은 std::function<> 선언의 형식이 람다 식의 구문 분석으로 전파되지 않는다는 것을 보여줍니다. 람다는 주변 표현과 독립적으로 파싱됩니다.

저는 언어 변호사가 너무 많지 않기 때문에이 언어가 C++ 언어 표준인지 아니면 실제 컴파일러의 제한인지 (필자는 g++ -std=c++11으로 테스트했습니다) 확실하지 않습니다.

1

에서 람다의 반환 형식 (4)와 같이 auto, 그리고 std::vector (2) 당신은 여전히 ​​람다를 사용하지만, 반환 유형을 강제 마지막 샘플에있다.

return {1}에서 auto의 공제는 그 std::vector<int>()std::function이 기대는 다릅니다, std::initializer_list<int>()에 연결됩니다.

+0

* "반환 값 {1}의 자동 차감은 std :: initializer_list ()"*으로 이어진다. 'auto {= {1};에서'a '가 이니셜 라이저리스트가된다는 사실은'[] {return {1};}이'initializer_list'를 리턴 타입으로 추론한다는 것을 의미하지 않습니다. –