http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54557
--- Comment #1 from Daniel Krügler <daniel.kruegler at googlemail dot com>
2012-09-12 20:54:26 UTC ---
The compiler behaviour looks correct to me. The difference of the lambda
expressions in bar and foo3 compared to the other two is that these are
capture-free lambdas and thus have a conversion function to function pointer.
Each lambda expression corresponds to a unique class type, so what we have in
foo1 and foo2 can be compared with the following class-example:
struct A{};
struct B{};
void f() {
false ? A() : B();
}
This expression has no common type for the conditional operator and is
ill-formed.
What we have in bar and foo3 can be compared with the following class-example :
struct A{ typedef void (*F)(); operator F(); };
struct B{ typedef void (*F)(); operator F(); };
void f() {
false ? A() : B();
}
This is well-formed, because in the last step of the conditional operator
conversion attempts (5.16p5), more general conversions are attempted and these
find the common pointer to function.
The current compiler behaviour gives a correct diagnostics and I see nothing
wrong with it.