Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't the type of my class-static auto function be deduced within the class scope?

Tags:

c++

c++14

I'm trying to get the return type of an auto function. This works:

auto foo(int bar)
{
    return 0;
}

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

Great, here's the next step then: getting the return type of a static auto function in a class scope. This also works:

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

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

But this doesn't work:

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

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

GCC says "error: use of 'static auto Foo::foo(int)' before deduction of 'auto'", Clang says "function 'foo' with deduced return type cannot be used before it is defined". Why?

like image 380
zneak Avatar asked Jan 25 '17 03:01

zneak


1 Answers

While the way you have written the code makes it appear possible, the in-class definition of foo() can only be processed after the class is fully defined. It is as if you wrote this:

struct Foo
{
    static auto foo(int bar);

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

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

The definition of foo() is allowed to use types defined in class Foo, including foo_t, which would be circular. Therefore, the definition of class Foo is not allowed to use the definition of its member functions--only their declarations.

In other words, you assume the code is fully evaluated from the top to the bottom. It is not.

like image 148
John Zwinck Avatar answered Sep 27 '22 20:09

John Zwinck