decltype作为类成员函数中的返回类型

Sun*_*min 12 c++ decltype c++11

我在代码下面编译错误.

struct B{
    double operator()(){
        return 1.0;
    }
};

struct A {
    auto func() -> decltype(b())
    {
        return b();
    }

    B b;
};
Run Code Online (Sandbox Code Playgroud)

但是,如果我重组A,它会编译.

gcc 4.8表示'b'未在此范围内声明.

struct A {
    B b;
    auto func() -> decltype(b())
    {
        return b();
    }
};
Run Code Online (Sandbox Code Playgroud)

那么,第一个出了什么问题?

And*_*owl 11

有效吗?

你的最后一个例子是格式良好的,而第一个例子不是(所以GCC是正确的).

关于非限定名称查找的第3.4.1/7段规定:

X 成员函数体外的类定义中使用的名称,非静态数据成员的默认参数,大括号或等于初始化程序,或嵌套类定义应使用以下方式之一声明:

- 在课堂上使用之前X或者是X(10.2)的基类成员,或者

- [...]

以下是其他不适用于您的情况.


Pot*_*ter 9

class处理它的定义是两遍:首先收集成员声明,​​包括函数签名,然后解析定义的主体.

因此,函数体可以访问所有成员声明,​​包括后续声明,但函数原型只能看到前面的声明.