2013-05-27 3 views
9

이 고려 선언 된 following code :decltype : 오류 "참조"멤버 이전에 사용

struct test {  
    auto func() -> decltype(data) {} // ERROR 

    int data; 
}; 

int main() { 
    test t; 
    t.func(); 
} 

그것은 다음과 같은 오류 제공 : 내가 위에서 data를 배치하면, 그러나

main.cpp:2:29: error: 'data' was not declared in this scope 
    auto func() -> decltype(data) {} 

func(), 오류 없음 (live code) :

struct test {  
    int data; 

    auto func() -> decltype(data) {} 
}; 

... 

그래서 내 질문에, decltype은 (선언에서 정의가 아닌 decltype이 사용 된 경우) 멤버를 고려하지 않은 이유는 무엇입니까? 또한 언어 표준의 향후 반복에서이 동작에 변경 사항이 있는지 알고 싶습니다.


내가 다르게 동작하는 decltype을 기대했기 때문에 나는이 부탁 해요 있습니다. 코딩 규칙은 클래스 데이터 멤버를 클래스 함수 아래에 배치하는 것입니다. 확실히이 다른 행동은 내가 반원들을 어떻게 조직 할 것인지에 영향을 미친다. 내 코딩 규칙을 유지할 수있는 해결 방법을 제공 할 수 있다면 매우 감사 할 것입니다.

+0

죄송합니다 - C++의 성격, C에서 상속 –

+0

단순한'typedef '는'decltype'뿐만 아니라 [같은 행동] (http://coliru.stacked-crooked.com/view?id=8f959fbd70b0b7d44c21ff0d71967fd5-6f7ec8a47f20223a17b26973b6e13527)을 보여줍니다. 'typedef '를 멤버 함수 정의 위로 옮기면 분명히 문제가 해결 될 것입니다. – Praetorian

+0

@Praetorian 그래서 내재적 인 문제입니다 ... 너무 나쁩니다. –

답변

7

후행 반환형 멤버 함수의 일부 않는 데이터 멤버 또는 후에 선언 멤버 함수에 액세스 할 수없는 선언, 멤버 함수 달리 정의이다. C++ 14에서이 동작의 변경 사항을 알지 못합니다.

는 C++ 11 표준의 3.4.1-7 참조 규정되지 않은 이름은 룩업 :

A name used in the definition of a class X outside of a member function body or nested class definition shall be declared in one of the following ways:

  • before its use in class X or be a member of a base class of X (10.2), or...

는 (강조 광산)

+0

3.3.7/1에있는 반원 구성원의 범위 정의를 참조하십시오. – aschepler