2012-07-03 2 views
34

C++ 11에서는 비 정적 데이터 멤버가 선언에서 초기화되는 경우 'auto'로 선언 할 수 있습니까? 예를 들어 그것은 int x = 5;을 허용하면서C++ 11 - 'auto'로 비 정적 데이터 멤버 선언

struct S 
{ 
    auto x = 5; // in place of 'int x = 5;', which is definitely allowed 
}; 

GCC 4.7 위의 코드를 거부한다.

이것은 컴파일러 버그가 아니라 표준이 실제로 그것을 허용하지 않는다고 가정 할 때 왜 그렇습니까? 로컬 변수를 선언하는 것만 큼 유용 할 것입니다 auto.

+4

정적 데이터 멤버를 이렇게 선언 할 수는 있지만 정적이 아닌 데이터 멤버는 선언 할 수 없습니다 (C++ 11 §7.1.6.4에서 허용되는'auto' 사용 목록 참조). 내 머리 꼭대기에서 나는 그것이 왜 '오토'의 남용이라고 생각할 지 모르지만 나는 그것이 금지 된 이유에 대해 생각할 수 없다. –

+0

@JamesMcNellis : 왜 이것을 '자동'악용이라고 생각하니? 길고 복잡한 타입 이름을 가진 변수를 가지는 것의 차이점은 무엇입니까 (그래서 타입을 쓰지 않고'auto'를 쓰는 것이 바람직합니다). – HighCommander4

+4

블록 범위에서 변수가 _used_인지 어떻게 알 수 있습니다. 클래스 범위 또는 네임 스페이스 범위에서 변수가 사용되는 방식을 반드시 알 필요는 없습니다. 예를 들어 좀 더 일반적인'auto x = f (a, b, c);를 생각해 봅시다 :'f()'함수를 모두 찾아서 머리 속에 과부하 해결을 수행해야합니다. 타입은'x'입니다. 최소한 지역 범위에서 나는'x'로 무엇을하고 있는지보고 그 타입이 무엇인지를 추론 할 수 있습니다. 'auto'는 유용하지만, _everywhere_에 사용하면 안됩니다. –

답변

51

비 정적 부재를 금지하는 규칙 7.1.6.4 절 4이다

자동 타입 지시자는 에서 선택 문장의 조건 (6.4) 변수를 선언에서 사용될 수

또는 반복형 문 (6.5), new-type-id 또는 type-idnew-expression (5.3.4)의 type-specifier-seq, 범위 내 선언 및 선언 a 정적 데이터 멤버은 클래스 정의 (9.4.2)의 멤버 사양에 나타나는 중괄호 또는 동등한 이니셜 라이저를 사용합니다.

제임스 맥 넬리 스 (James McNellis)가 코멘트에서 설명하는 방식을 반영하는 정적 인 here이라는 이론적 근거가 있습니다.

국가 신체 기관이 싫어서 에 대한 자동 유형 지정자가 허용되지 않습니다. 저자에게 전자 메일에서 : X의 레이아웃을 결정하기 위해

template< class T > 
    struct MyType : T { 
     auto data = func(); 
     static const size_t erm = sizeof(data); 
    }; 

, 우리는 지금 2 상 이름 조회 및 ADL 있습니다. func는 유형 또는 함수 일 수 있습니다. T, MyType의 네임 스페이스, 인스턴스화 될 때 T의 네임 스페이스, 글로벌 네임 스페이스, 익명 네임 스페이스 또는 using 지시문의 대상 네임 스페이스에서 찾을 수 있습니다. 우리는 아마 concept_map lookup을 던질 수있다. 헤더 포함 순서에 따라 ADL에 대한 결과가 달라질 수 있으며 을 진단 할 필요가없는 하나의 정의 규칙을 위반합니다.

이 논란 때문에 작성자는 더 이상 자동이 아닌 데이터 멤버에 을 허용 할 것을 제안하지 않습니다.

기본적으로 헤더 포함 순서에 따라 data의 유형이 매우 다를 수 있습니다. 물론 auto x = 5;은 2 단계 이름 조회 또는 ADL에 의존 할 필요가 없지만 그렇지 않은 경우에는 모든 사용 사례에 대해 개별 규칙을 만들어야하기 때문에 "담요"규칙을 사용했다고 가정합니다. 상황을 매우 복잡하게 만든다.

동일한 논문에서 저자는이 제한을 제거 할 것을 제안했으나이 제안은 아마도 위의 이유 때문에 거부되었으며 예상 된 동작은 이니셜 라이저가 무엇이든간에 동일 할 수 있습니다.

+5

그걸 파헤쳐 줘서 고마워, 그게 흥미로운 근거 야! – HighCommander4

+2

N.B. 그것을 허용하는 원래의 제안은 [N2426] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2426.htm) –

+1

@ JonathanWakely 정말 그 주제를 볼 수있는 희망은 없습니다 부활 한 C++ 20에 대한 말? 내 코드에는 허용되는 경우 훨씬 더 읽기 쉽도록 여러 위치가 있습니다. 대부분'auto foo_ = Type {...};'이므로,이 경우는 이미 도움이 될 것입니다. – akim

관련 문제