10

考虑以下代码

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表现不同。我的编码约定是将类数据成员放在类函数下方。当然,这种不同的行为会影响我组织班级成员的方式。如果您能提供任何可以保留我的编码约定的解决方法,我将不胜感激。

4

1 回答 1

9

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

请参阅 C++11 标准的 3.4.1-7,Unqualified name look-up

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

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

(强调我的)

于 2013-05-27T05:34:34.490 回答