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

时间:2018-08-20 12:43:17

标签: c++ c++11 auto decltype 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;}
};

现在我的问题是,为什么编译器不在类的私有部分中查找,因为删除尾随返回类型或将私有部分放在masterMethod之上可以解决此问题(decltype(auto) (在允许使用C ++ 14的情况下)其自动返回类型推导也将是正确的。

此外,当decltype(m1())m1()具有相同的返回类型时,删除m2()时是否会发生不良行为,这对我也一样?

1 个答案:

答案 0 :(得分:8)

这与private和尾随返回类型均无关。

这里的问题是,虽然一个类中的所有声明的名称都在其成员函数的 bodies 的范围内,但尾随类型却不是函数主体的一部分-它是原型的一部分。

以下是这个问题的小得多的示例:

struct A
{
    T f();
    using T = int;
};

而g ++说

error: 'T' does not name a type

但这很好:

struct A
{
    using T = int;
    T f();
};

唯一的解决方案是更改声明的顺序。