Sungmin
Sungmin

Reputation: 2631

decltype as a return type in class member function

I got error compiling below code.

struct B{
    double operator()(){
        return 1.0;
    }
};

struct A {
    auto func() -> decltype(b())
    {
        return b();
    }

    B b;
};

However, if I reorganize the A, it compiles.

gcc 4.8 said that 'b' was not declared in this scope.

struct A {
    B b;
    auto func() -> decltype(b())
    {
        return b();
    }
};

So, what is wrong with the first??

Upvotes: 12

Views: 3534

Answers (3)

Serve Laurijssen
Serve Laurijssen

Reputation: 9733

You can also get it to work like this:

struct B
{
    double operator()()
    {
        return 1.0;
    }
};

// my implementation does not have std::declval
template < typename T > T&& declval();

struct A
{
    B b;
    auto func() -> decltype(declval<B>().operator()())
    {
        return b();
    }
};

edit: or since B is in scope already anyway no need for auto, -> decltype and declval

struct A
{
    B b;
    decltype(Q()()) func()
    {
        return b();
    }
};

Upvotes: 1

Andy Prowl
Andy Prowl

Reputation: 126412

Is it valid?

Your last example is well-formed, while the first one is not (so GCC is correct).

Paragraph 3.4.1/7 on unqualified name lookup specifies:

A name used in the definition of a class X outside of a member function body, default argument, brace-or- equal-initializer of a non-static data member, or nested class definition shall be declared in one of the following ways:

before its use in class X or be a member of a base class of X (10.2), or

— [...]

And what follows are other conditions that do not apply in your case.

Upvotes: 11

Potatoswatter
Potatoswatter

Reputation: 137770

The definition of the class is processed it two passes: first the member declarations are collected, including function signatures, and then the bodies of definitions are parsed.

The function body therefore has access to all member declarations, including subsequent ones, but the function prototype only sees preceding declarations.

Upvotes: 9

Related Questions