2017-11-30 11 views
2

나는 에서 가장 까다로운 구문 분석에 대한 항목 6을 찾고 있습니다. 효과적인 STL : Scott Meyers의 표준 템플릿 라이브러리의 개선을위한 50 가지 구체적인 방법.STL 스코틀러 마이어에서 난해한 구문 분석

(자신의 트위스트 방식으로) 재미 모두
ifstream dataFile("ints.dat"); 
list<int> data(istream_iterator<int>(dataFile), // warning! this doesn't do 
       istream_iterator<int>()); // what you think it does 

,하지만 우리가리스트 객체가 파일의 내용으로 초기화되어야한다는 인 말하고 싶은 무슨 말을 도움이되지 않습니다. 우리가 파싱해야 할 내용을 알았으니 표현하기 쉽습니다. 형식적인 매개 변수 선언을 괄호로 묶는 것은 합법적이지 않습니다. 그러나 괄호로 함수 호출에 인수를 돌리는 것은 합당합니다. 따라서 괄호 쌍을 추가하여 컴파일러가 어떤 식 으로든 내용을 볼 수있게 만듭니다.

list<int> data((istream_iterator<int>(dataFile)), // note new parens 
       istream_iterator<int>0); // around first argument 
             // to list's constructor 

내 질문은 다음과 같은 진술로 작성자는 무엇을 의미합니까? "그것은 괄호 형식 매개 변수 선언을 둘러싸고 법적 아니지만, 괄호와 함수 호출에 인수를 둘러싸고 법적는"

감사

+2

그 책은 다소 오래되었습니다. 요즘에는 유니폼 초기화를 사용하여 해당 구문 분석을 무력화합니다. – StoryTeller

+1

'int foo ((int a))'를 할 수 없습니다. 그러나 당신은 int foo (((42))))'를 할 수있다. – Jarod42

답변

2

저자는 진술에 따라 무엇을 의미합니까? 은 괄호와 형식 매개 변수 선언을 둘러싸고 법적 아니지만, 괄호와 함수 호출에 인수를 둘러싸고 법적

인 스콧 마이어스가 무슨 말을,

, 그의 인수를 둘러싼로 후자는 불법이 될 것이기 때문에 괄호 함수 호출은 만하는 함수 호출하지함수 선언 할 수 있습니다 (예 : 함수 선언되는 가능성을 배제한다).

그렇지 않으면 둘 다 유효하면 대신 함수 선언으로 해석됩니다. 이것은 C++의 이 가장 복잡한 구문 인 때문에 발생합니다. 선언으로 해석 될 수있는 모든 것은 그러한 것으로 해석됩니다. ,

ifstream dataFile("ints.dat"); 
list<int> data{istream_iterator<int>(dataFile), istream_iterator<int>()}; 

data 함수 선언으로 해석되지 않습니다 :


으로 이미 C++ (11)로, 대신 중괄호 초기화를 사용할 수 StoryTeller에 의해 this comment에서 제안 왜냐하면 중괄호는 함수 선언에 허용되지 않기 때문입니다.