Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does C++17 if statement with initializer not work as expected?

struct A
{
    auto g1()
    {
        return true;
    }

    void f()
    {
        if (auto b = g1(); b) // ok
        {
            return;
        }

        if (auto b = g2(); b) // error: use of 'auto A::g2()' before deduction of 'auto'
        {
            return;
        }
    }    
    
    auto g2()
    {
        return true;
    }
};

Why does C++17 if statement with initializer not work as expected?

like image 641
xmllmx Avatar asked May 06 '21 12:05

xmllmx


1 Answers

Because the standard says so (quote from latest draft):

[dcl.spec.auto.general]

If a variable or function with an undeduced placeholder type is named by an expression ([basic.def.odr]), the program is ill-formed. Once a non-discarded return statement has been seen in a function, however, the return type deduced from that statement can be used in the rest of the function, including in other return statements.

[Example 4:

auto n = n;                     // error: n's initializer refers to n
auto f();
void g() { &f; }                // error: f's return type is unknown

To add a little bit of clarification, the "declaration" of g2 is "seen" because the definition of g1 is in the complete-class context. But that does not extend to having seen the definition of g2.

like image 155
eerorika Avatar answered Sep 29 '22 06:09

eerorika