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??
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
Xoutside 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
Xor 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.
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