https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86385
Bug ID: 86385 Summary: calling wrong constructors? Product: gcc Version: 8.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: zhonghao at pku dot org.cn Target Milestone: --- The code is as follow: struct A { int* a; A(int a) : a(new int(a)) {} ~A() { delete a; } A(const A&) = delete; A(A&& other) { a = other.a; other.a = 0; }; operator bool() { return true; } int operator*() { return *a; } }; static A makeA(int x) { return A(x); } int main() { A c = makeA(42) ?: makeA(-1); return *c; } g++ error: error: lvalue required as unary '&' operand A c = makeA(42) ?: makeA(-1); It seems that g++ considers 42 and -1 as const A& or A&& other, instead of integer values. Or else, it does not produce such a message. I tried clang++. It accepts the code. For me, the results of clang++ are more reasonable.