2012-01-19 3 views
5

이 예제를 고려 함수 선언으로 해석됩니다 이렇게 :벡터 생성자는

std::istream_iterator<std::string> it_begin(iss); 
std::istream_iterator<std::string> it_end; 
std::vector<std::string> vec(it_begin, it_end); 

또는 다음과 같이 각 매개 변수에 괄호를 넣어 :

std::vector<std::string> 
vec((std::istream_iterator<std::string>(iss)), 
    (std::istream_iterator<std::string>())); 

또는 C++ 11의 새로운 유니폼 초기화와 왜 컴파일러는 예로의 선언을 구문 분석

std::vector<std::string> vec { /*begin*/, /*end*/ }; 

함수 선언? 나는 가장 까다로운 구문 분석에 대해 알고 있지만 빈 매개 변수 목록에서만 발생한다고 생각했습니다. 왜 두 번째 해결 방법이 효과가 있는지 궁금합니다.

+0

GCC 4.6.1, 중요한 경우. 나는 또한 comau의 온라인 컴파일러로 시도했다. – jrok

+0

다음과 같이 타이핑을하지 않아도됩니다 :'std :: istream_iterator it_begin (iss), it_end; std :: vector vec (it_begin, it_end); ' –

+0

형식이 잘 구성되어 잘 형식화 된 질문으로 주제별로 유용합니다. 잘 했어. :) –

답변

9

여전히 가장 까다로운 구문입니다.

std::vector<std::string>      // return type 
vec(          // function name 
    std::istream_iterator<std::string>(iss), // param 1: an iterator called (iss), or just iss 
    std::istream_iterator<std::string>()  // param 2: unnamed function 
);           //   returning iterator 

조르디는 말한다 :

<tomalak> << ETYPE_DESC(vec); std::vector<std::string> vec(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>()); 
<geordi> lvalue function taking a istream_iterator<string, char, char_traits<char>, long> , a pointer to a nullary function returning a istream_iterator<string, char, char_traits<char>, long> , and returning a vector of strings 

그것의 요점은, 정말, 당신의 매개 변수 이름이 그들 주위에 괄호를 가질 수 있습니다 (즉 iss(iss)) 선언의 의미를 변경하지 않고. 때때로.

설명했듯이 타입을 둘러싼 다른 괄호 세트 을 사용하여 첫 번째 매개 변수 (결과적으로 두 번째 매개 변수)가 선언이 아닌 표현식으로 해석되도록합니다. 도움이된다면


, 또한 고려 :

void foo(int (x)) { 
    cout << x; 
} 

int main() { 
    foo(42); 
} 

Output is 42합니다.

+0

@Als : 선언은 완벽하게 유효합니다. 그러나 벡터 선언과 함수 선언으로 모두 유효하며 표준은 후자가 우선한다는 것을 나타냅니다. 그것은 당신의 기본 [가장 애도하는 구문] (http://en.wikipedia.org/wiki/Most_vexing_parse)입니다. OP는 그의 선언이 유효한 _function_ 선언이라는 사실에 놀라기 만합니다. 왜냐하면 첫 번째 인수의 이름을 둘러싼 괄호 때문입니다. –

+0

Err .. 어쩌면 그 괄호가 중복 되어도 아무렇게나 괄호를 붙일 수는 없으며 여전히 같은 방식으로 작동합니다. –

+0

@Als : 맞습니다. 그것이 요점입니다. 복수형은 "괄호"입니다. –