https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102212
Bug ID: 102212
Summary: The explicit conversion function should be permitted
in direct-initialization of a reference
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: xmh970252187 at gmail dot com
Target Milestone: ---
struct D{};
D global;
struct A{
explicit operator D(){
return global;
}
};
int main(){
A a;
D&& rf(a);
}
GCC rejects this example. According to [dcl.init.ref#5.3.2]
> has a class type (i.e., T2 is a class type), where T1 is not
> reference-related to T2, and can be converted to an rvalue or function lvalue
> of type “cv3 T3”, where “cv1 T1” is reference-compatible with “cv3 T3” (see
> [over.match.ref]),
And [over.match.ref#1]
> “cv2 T2” and “rvalue reference to cv2 T2” (when initializing an rvalue
> reference or an lvalue reference to function)
> For direct-initialization, the permissible types for explicit conversion
> functions are the members of R where T2 can be converted to type T with a
> (possibly trivial) qualification conversion ([conv.qual]); otherwise there
> are none.
In this direct-initialization `D&& rf(a);`, `A::operator D()` should be a
candidate.