私有方法作为尾随返回类型(decltype)

mbe*_*dev 6 c++ decltype auto c++11 trailing-return-type

当我尝试decltype()在私有方法函数上使用时,我得到私有方法的错误error: 'm1' has not been declared in this scope

#include <stdint.h>

class C
{
public:
    C()=default;
    ~C()=default;

    auto masterMethod(int opMode) ->decltype(m1())
    {
        switch(opMode)
        {
        case 1:
                return m1(); break;
        case 2:
                return m2(); break;
        default:
                return m1(); break;
        }
    }
private:
    int m1() {return 1;}
    int m2() {return 2;}
};
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,为什么编译器不在类的私有部分中查找,因为删除尾随返回类型或将私有部分放在顶部masterMethod解决了问题(decltype(auto)[如果允许C++ 14]也是正确的自动返回类型扣除).

此外,当删除decltype(m1())when m1()m2()具有相同的返回类型时,它是不好的行为,因为这也适合我吗?

mol*_*ilo 8

private与尾随返回类型无关.

这里的问题是,虽然在一个类中的所有声明的名称是在范围机构的成员函数,尾随类型不是函数体的一部分-这是原型的一部分.

以下是同一问题的一个小得多的例子:

struct A
{
    T f();
    using T = int;
};
Run Code Online (Sandbox Code Playgroud)

而g ++说

error: 'T' does not name a type
Run Code Online (Sandbox Code Playgroud)

但这很好:

struct A
{
    using T = int;
    T f();
};
Run Code Online (Sandbox Code Playgroud)

唯一的解决方案是改变声明的顺序.

  • 不#1 [这里](http://eel.is/c++draft/basic.scope.class#:scope,class)与此相矛盾吗? (2认同)