Namespaces
Variants
Actions

Talk:cpp/language/if

From cppreference.com

Hi,


I want to ask about the case in the `constexpr if` section.

In the standard (8.5.1.2), it says "During the instantiation of an enclosing templated entity (13.1), if the condition is not value-dependent after its instantiation, the discarded substatement (if any) is not instantiated."

But what's the case that a expression could be not value-dependent after its instantiation?

The cppreference gives a example (https://en.cppreference.com/w/cpp/language/if):

template<class T> void g() {
 
    auto lm = [](auto p) {
        if constexpr (sizeof(T) == 1 && sizeof p == 1) {
           // this condition remains value-dependent after instantiation of g<T>
        }
    };
}

But I don't think this is the same case with the standard. The standard says "after its instantiation", but the example says "this condition remains value-dependent after instantiation of g<T>". I think in this case, "its" should be the generic lambda.

Could anyone explain this to me?

Thanks very much. — Preceding unsigned comment added by Chuanqi (talkcontribs)

We intendedly show a counterexample. It would be an example of the case if the condition is replaced with sizeof(T) == 1. --Fruderica (talk) 05:14, 15 July 2020 (PDT)




I am still confused for the example sizeof(T) == 1. In my minds, when the lambda instantiating, the g<T> must have instantiated.

[edit] errors in example

In the example supplied with the if with initializers there are several undefined entities. Most notably the capture [&s], unsafe_ping and an other line with multiple problems.

The capture is annoying as there is an s in the block, but it is hidden inside the if(). 2001:980:90E5:1:E1A:8100:56E1:3DED 01:49, 13 July 2021 (PDT)

yes, that code fragment isn't intended to be compilable. It shows motivational use cases lifted directly from the proposal. I suppose it does look a little too crowded the way it's rendered here. --Cubbi (talk) 15:12, 13 July 2021 (PDT)