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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With