I tried to compile the following C++11 code with mixed results.
struct NoTemplate {
static constexpr auto (*foo)() = false ? +[]{} : nullptr;
};
NoTemplate no_inst;
template<typename>
struct YesTemplate {
static constexpr auto (*foo)() = false ? +[]{} : nullptr;
};
YesTemplate<float> yes_inst;
NoTemplate
sucessfully; gives error: a lambda expression may not appear inside of a constant expression
on YesTemplate
.What is the correct result? I see some standard language suggesting non-constant expressions should be OK in the false branch of short-circuiting operators in constant expressions, but IANALL.
This program is well-formed.
Note after C++17, a lambda expression may be accepted in a core constant expression even if it would be evaluated. You can see the proposed paper N4487 for detail.
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