类方法声明中的decltype:在声明“引用”成员之前使用时出错

时间:2013-05-27 04:04:26

标签: c++ c++11 decltype

考虑following code

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

    int data;
};

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

它出现以下错误:

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

但是,如果我将data放在func()之上,则不会出错(live code):

struct test {    
    int data;

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

...

所以我的问题是,为什么decltype没有考虑在它之后声明的成员(在方法声明中使用decltype时,而不是在定义中)?我还想知道在将来的语言标准迭代中这种行为是否有任何变化。

<小时/> 请注意我问这个是因为我期待decltype表现不同。我的编码约定是将类数据成员放在类函数下面。当然,这种不同的行为会影响我组织班级成员的方式。如果您能提供可以保留我的编码惯例的任何解决方法,我将非常感激。

1 个答案:

答案 0 :(得分:8)

尾随返回类型是成员函数声明的一部分,它不能访问数据成员或后面声明的成员函数,这与成员函数 definition 不同,哪个。我不知道在C ++ 14中这种行为有任何改变。

参见C ++ 11标准的3.4.1-7,非限定名称查找

  

在成员函数体之外的类X 的定义中使用的名称或嵌套类定义   应以下列方式之一宣布:

     
      
  • 在X类中使用之前或者是X(10.2)基类的成员,或者......
  •   

(强调我的)