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

decltype in class method declaration: error when used before "referenced" member is declared

本文关键字:声明 出错 referenced 成员 decltype 类方法      更新时间:2023-10-16

考虑以下代码:

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()上面,它没有给出错误(活动代码):

struct test {    
    int data;
    auto func() -> decltype(data) {}
};
...

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


请注意,我问这个是因为我期待decltype的行为不同。我的编码惯例是将类数据成员放在类函数下面。当然,这种不同的行为会影响我组织班级成员的方式。

如果您能提供任何可以保留我的编码惯例的解决方案,我将非常感激。

后面的返回类型是成员函数声明的一部分,它不能访问在它之后声明的数据成员或成员函数,而成员函数定义可以访问。我不知道c++ 14中这种行为有任何变化。

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

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

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

(强调我的)