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
表现不同。我的编码约定是将类数据成员放在类函数下面。当然,这种不同的行为会影响我组织班级成员的方式。如果您能提供可以保留我的编码惯例的任何解决方法,我将非常感激。
答案 0 :(得分:8)
尾随返回类型是成员函数声明的一部分,它不能访问数据成员或后面声明的成员函数,这与成员函数 definition 不同,哪个。我不知道在C ++ 14中这种行为有任何改变。
参见C ++ 11标准的3.4.1-7,非限定名称查找:
在成员函数体之外的类X 的定义中使用的名称或嵌套类定义 应以下列方式之一宣布:
- 在X类中使用之前或者是X(10.2)基类的成员,或者......
(强调我的)