Extended Description
Today's trunk and release/10.x accept the TU:
struct ExplicitToInt {
explicit operator int() const;
};
const int& x(ExplicitToInt{}); // #1
int&& y(ExplicitToInt{}); // #2
despite that GCC, MSVC, and I agree that both reference bindings are ill-formed. Running quickly through the bullets in [dcl.init.ref]/5:
-
5.1 doesn't apply: the initializer is not an lvalue
-
5.2 doesn't apply: neither target reference is an lvalue reference to non-const-qualified or volatile-qualified type
-
5.3.1 doesn't apply: Neither int nor const int is reference-compatible with ExplicitToInt
-
5.3.2: doesn't apply, assuming that "can be converted" means "can be implicitly converted"
-
5.4: doesn't apply because the explicit conversion operator cannot be selected for "copy-initialization of an object of type "cv1 T1" [const int and int for #1 and #2 respectively] by user-defined conversion".
Extended Description
Today's trunk and release/10.x accept the TU:
despite that GCC, MSVC, and I agree that both reference bindings are ill-formed. Running quickly through the bullets in [dcl.init.ref]/5:
5.1 doesn't apply: the initializer is not an lvalue
5.2 doesn't apply: neither target reference is an lvalue reference to non-const-qualified or volatile-qualified type
5.3.1 doesn't apply: Neither int nor const int is reference-compatible with ExplicitToInt
5.3.2: doesn't apply, assuming that "can be converted" means "can be implicitly converted"
5.4: doesn't apply because the explicit conversion operator cannot be selected for "copy-initialization of an object of type "cv1 T1" [const int and int for
#1and#2respectively] by user-defined conversion".