2012-02-06 4 views
2

C++ 11에서는 이제 함수 인수로 즉석에서 객체를 생성 할 수 있습니다.C++ 11 on the fly 공사 불일치

예를 들어, 우리는 표준에 새로운 쌍을 삽입 할 수 있습니다 : 맵과 같이 :이 또한 표준 : : 벡터 작동

typedef std::map<char, int> MapType; 
MapType my_map; 

my_map.insert({'f', 6}); //less verbose than make_pair 

합니다. 그러나 std :: array의 경우에는 이상하게 작동하지 않습니다.

예 :

#include <iostream> 
#include <array> 
#include <vector> 

using namespace std; 

void arr_on_fly(std::array<int, 4> arr) 
{ 
    /*...*/ 
} 

void vec_on_fly(std::vector<int> vec) 
{ 
    /*...*/ 
} 

int main() 
{ 
vec_on_fly({1, 2, 3, 4}); 
arr_on_fly({1, 2, 3, 4}); 
} 

링크 : http://ideone.com/gvIUF

왜이 작동하지 않는 이유는 무엇입니까? 이것이 C++ 11 표준의 결함입니까?

std::array<int, 4u> arr = {1, 2, 3, 4}; 
+0

당신도 알다시피, C++ 03은 함수 인자 *로 즉석에서 객체를 만들자. 다른 문법을 사용해야한다;) –

+3

"* 우리는 std :: array를 다음과 같이 초기화 할 수있다 : 'std :: array arr = {1, 2, 3, 4};'* "그렇지만 __cannot__을 이렇게 구성하면 : std :: array arr {1, 2, 3, 4} - 대신 std :: array arr {{1, 2, 3, 4}};'가되어야합니다. 'arr_on_fly ({{1, 2, 3, 4}});'와 같은 컨텍스트에도 적용됩니다. – ildjarn

+0

ildjarn, 틀렸어. http://ideone.com/R3QUn을 참조하십시오. – Ricky65

답변

2

: 우리가 같은 표준 : 배열을 초기화 할 수

오류는 "변환 할 수 없습니다 '는 {1, 2, 3, 4}' '표준 : : 배열'에"터무니없는 것 나는이 불일치의 이유를 모른다. 그러나 여분의 중괄호를 추가하면 컴파일됩니다.

arr_on_fly({{1, 2, 3, 4}}); 
+2

"이 불일치의 이유를 모르겠습니다 *"하나는 "uniform-initialization"이고 다른 하나는 집계 초기화입니다. 의도적 인 피상적 유사성에도 불구하고 구문 규칙이 다릅니다. – ildjarn

+0

여분의 괄호 쌍으로 Ideone (gcc-4.5.1)에서 컴파일되지 않습니다. http://ideone.com/ss4OB를 참조하십시오. – Ricky65

+0

@ Ricky65 : 그것은 단지 GCC 4.5.x의 결함입니다. – ildjarn

0

{}은 과부하입니다. balki의 용액

arr_on_fly({{1, 2, 3, 4}}); 

아우터 브래킷 의미 추론-A-구성된 오브젝트와 최 브래킷 구성-AN-초기화리스트를 의미한다.

솔직히 말해서 어떤 경우에도 호출이 모호하지 않습니다. 당신이 과부하

arr_on_fly(std :: initializer_list <int>) 
다음

캐스팅을 추가하고 다른 함수로 처리를 연기하면 내가 초기화 목록 및 추정 construcors의 상호 작용에 대한 정확한 규칙을 기억 할 수는 없지만, 그 작동합니다.

+2

"* 바깥 괄호는 추론 된 - 생성 객체를 의미하고 안쪽 괄호는 구조체 - 이니셜 라이저 -리스트를 의미합니다. *"std :: array <> "는 집계 유형이므로 'std : : initializer_list <>'here; 바깥 쪽 괄호는'std :: array <>'를 초기화하고 내부는'std :: array <>'의 내부 C 배열을 초기화합니다. – ildjarn

관련 문제