Sessile Computing
Sessile Computing

Reputation: 271

Lambda in branch not taken of constant expression: Who is right?

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;

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.

Upvotes: 7

Views: 293

Answers (1)

xskxzr
xskxzr

Reputation: 13040

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.

Upvotes: 1

Related Questions