【问题标题】:decltype in class method declaration: error when used before "referenced" member is declared类方法声明中的 decltype:在声明“引用”成员之前使用时出错
【发布时间】:2013-05-27 04:04:26
【问题描述】:

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

【问题讨论】:

  • 对不起——C++的本质,继承自C。
  • 不只是decltype,即使是简单的typedef 也会显示same behavior。将typedef移到成员函数定义上方显然可以解决问题。
  • @Praetorian 所以这是一个固有的问题......太糟糕了。
  • @Mark Garcia,这实际上是有好处的,它迫使程序员编写可理解的代码。

标签: c++ c++11 decltype


【解决方案1】:

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

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

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

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

(强调我的)

【讨论】:

  • 另见3.3.7/1中类成员作用域的定义。
猜你喜欢
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多