2016-12-21 5 views
5

방금 ​​msvc에서이 작은 오류가 발생했습니다. 그것은 나에게 구문 분석 문제처럼 보이지만 확실하지 않습니다.
다음은 나를 C2143 구문 오류 : 준다 ';' before '}'이상한 컴파일러 오류

#include <vector> 

struct X { }; 

X f(const std::vector<int> v) 
{ 
    for (auto i : v) 
    if (true) 
     return X{};  // <-- 

    return X{}; 
} 

int main() 
{ 
    const auto x = f(std::vector<int>{}); 
} 

다음 네 가지 변형은 잘 컴파일됩니다.

X f(const std::vector<int> v) 
{ 
    for (auto i : v) 
    if (true) 
     return X();  // <-- 

    return X{}; 
} 

X f(const std::vector<int> v) 
{ 
    for (auto i : v) 
    if (true) {  // <-- 
     return X{};  // <-- 
    }     // <-- 
    return X{}; 
} 

X f(const std::vector<int> v) 
{ 
    for (auto i : v) { // <-- 
    if (true) 
     return X{};  // <-- 
    }     // <-- 
    return X{}; 
} 

X f(const std::vector<int> v) 
{ 
    //for (auto i : v) // <-- 
    if (true) 
     return X{};  // <-- 

    return X{}; 
} 

(바보 코드의 벽에 대 한 죄송합니다.)
일부 난해한 규칙이 없거나 컴파일러 버그입니까?

비주얼 스튜디오 2015 (v140) 익스프레스 에디션은 데스크톱
것은이처럼 보이는

+1

사용중인 VS의 버전은 무엇입니까? – user657267

+0

컴파일 명령에서 C++ 11을 활성화 했습니까? 아마도 컴파일러가 C++ 03 용으로 컴파일되고있을 것입니다. –

+1

gcc에서 실패하지 않습니다 (물론 -std = C++ 11 옵션 포함). 따라서 컴파일러 버그 여야합니다. –

답변

3

(W4에 충돌 경고 수준 제외) 기본값으로 모두 디버그 및 릴리스 모드에서 64로
모든 컴파일러 옵션을 컴파일 나를위한 컴파일러 버그. rextester.com에 오류를 재현 할 수 있지만 webcompiler.cloudapp.net에 코드가 잘 컴파일됩니다 (Visual C++ 컴파일러 버전은 19.10.24807.0 (x86)).

gccclang도 모두 코드를 컴파일합니다.

구문 자체는 완벽하게 유효합니다.

+0

감사합니다. Edgar. 문제는 코드에 없었 음을 알았습니다. – Garp