비 정적 부재를 금지하는 규칙 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에 의존 할 필요가 없지만 그렇지 않은 경우에는 모든 사용 사례에 대해 개별 규칙을 만들어야하기 때문에 "담요"규칙을 사용했다고 가정합니다. 상황을 매우 복잡하게 만든다.
동일한 논문에서 저자는이 제한을 제거 할 것을 제안했으나이 제안은 아마도 위의 이유 때문에 거부되었으며 예상 된 동작은 이니셜 라이저가 무엇이든간에 동일 할 수 있습니다.
정적 데이터 멤버를 이렇게 선언 할 수는 있지만 정적이 아닌 데이터 멤버는 선언 할 수 없습니다 (C++ 11 §7.1.6.4에서 허용되는'auto' 사용 목록 참조). 내 머리 꼭대기에서 나는 그것이 왜 '오토'의 남용이라고 생각할 지 모르지만 나는 그것이 금지 된 이유에 대해 생각할 수 없다. –
@JamesMcNellis : 왜 이것을 '자동'악용이라고 생각하니? 길고 복잡한 타입 이름을 가진 변수를 가지는 것의 차이점은 무엇입니까 (그래서 타입을 쓰지 않고'auto'를 쓰는 것이 바람직합니다). – HighCommander4
블록 범위에서 변수가 _used_인지 어떻게 알 수 있습니다. 클래스 범위 또는 네임 스페이스 범위에서 변수가 사용되는 방식을 반드시 알 필요는 없습니다. 예를 들어 좀 더 일반적인'auto x = f (a, b, c);를 생각해 봅시다 :'f()'함수를 모두 찾아서 머리 속에 과부하 해결을 수행해야합니다. 타입은'x'입니다. 최소한 지역 범위에서 나는'x'로 무엇을하고 있는지보고 그 타입이 무엇인지를 추론 할 수 있습니다. 'auto'는 유용하지만, _everywhere_에 사용하면 안됩니다. –