为什么我的类静态自动函数的类型可以在类范围内推导出来?

时间:2017-01-25 03:37:44

标签: c++ c++14

我试图获取auto函数的返回类型。 This works

auto foo(int bar)
{
    return 0;
}

typedef std::result_of<decltype(foo)> foo_t;

很好,下一步是:在类范围内获取static auto函数的返回类型。 This also works

struct Foo
{
    static auto foo(int bar)
    {
        return 0;
    }
};

typedef std::result_of<decltype(Foo::foo)> foo_t;

但是this doesn't work

struct Foo
{
    static auto foo(int bar)
    {
        return 0;
    }

    typedef std::result_of<decltype(Foo::foo)> foo_t;
};

GCC说&#34;错误:使用&#39;静态自动Foo :: foo(int)&#39;在扣除&#39; auto&#39;&#34;之前,Clang说&#34;功能&#39; foo&#39;具有推导的返回类型在定义之前不能使用&#34;。为什么呢?

1 个答案:

答案 0 :(得分:14)

虽然编写代码的方式使得它看起来成为可能,但foo()的类内定义只能在完全定义类之后才能处理。就像你写的那样:

struct Foo
{
    static auto foo(int bar);

    typedef std::result_of<decltype(Foo::foo)> foo_t;
};

auto Foo::foo(int bar)
{
    return 0;
}

foo()的定义允许使用class Foo中定义的类型,包括foo_t,这将是循环的。因此,class Foo的定义不允许使用其成员函数的定义 - 只能使用它们的声明。

换句话说,您假设代码是从上到下完全评估的。事实并非如此。