2016-07-07 3 views
2

이 문제를 파악하는 데 좋은 시간이 걸렸습니다. 다음 코드구조체는 메서드 본문 내에서 선언 할 수 있지만 멤버 필드 초기화자를 포함하지 않는 경우에만 선언 할 수 있습니다. 컴파일러 버그인가요?

class Test { 
public: 
    void method(); 

    int _member; 
}; 

void Test::method() 
{ 
    struct S { 
     int s = 0; // same with int s {0}; 
    }; 

    _member; 
} 

int main(int argc, const char* argv []) 
{ 
    return 0; 
} 

은 컴파일 오류 생성합니다 :

1>error C2327: 'Test::_member' : is not a type name, static, or enumerator
1>error C2065: '_member' : undeclared identifier

을 그리고 오류가 최대한 빨리 int s;int s = 0; 교체로 도망 간다.

이것은 MSVC 2013에서만 발생하며 2015는 발생하지 않습니다. 저는 컴파일러 버그라고 확신합니다.하지만 C++과 관련이없는 익숙하지 않은 C++ 언어가 아닌지 확인하고 싶습니다. 및 C++ 14).

+0

이것은 G ++ - 5.3.0에서도 잘 컴파일됩니다. –

+2

버그처럼 보입니다. g ++ 및 clang 모두 제대로 컴파일되고 MSVS 2013은 C++ 11에 대한 최상의 지원을 제공하지 못했습니다. – NathanOliver

+0

내가 알 수있는 것부터, MSVC 2013은 비 정적 멤버 초기화를 지원하기로되어 있습니다. 하지만 저는 중괄호 초기화를 사용한 예제 만 보입니다. 'int {0};을 시도 했습니까? –

답변

1

[C++11: 12.6.2]은 C++ 11에서 NSDMI를 정의하며이 섹션이나 문서의 다른 섹션에서는 구문에 대한 이러한 제약 조건을 정의하지 않습니다. 따라서 구현 버그 여야합니다.

그리고 GCC, Clang 및 Visual Studio 2015가 모두 코드를 허용하기 때문에 더 자세한 조사가 필요하다고 생각하지 않습니다.