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

Mar*_*cia 9 c++ decltype c++11

请考虑以下代码:

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

    int data;
};

int main() {
    test t;
    t.func();
}
Run Code Online (Sandbox Code Playgroud)

它给出以下错误:

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

但是,如果我放在data上面func(),它没有错误(实时代码):

struct test {    
    int data;

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

...
Run Code Online (Sandbox Code Playgroud)

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


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

jua*_*nza 8

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

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

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

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

(强调我的)