https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118393
Bug ID: 118393
Summary: GCC does not allow calling of overloaded private type
conversion operator in default argument field of
friend function
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: wangbopku15 at gmail dot com
Target Milestone: ---
The following code does not compile in GCC:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class X {
friend void friend_set (int);
operator int() {return 0;};
};
void friend_set(int i=X()){}
void f()
{
X obj;
friend_set ();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The compiler complains that the calling of 'X::operator int()' in the default
argument field is inaccessible:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:9:23: error: 'X::operator int()' is private within this context
9 | void friend_set(int i=X()){}
| ^~~
<source>:3:3: note: declared private here
3 | operator int() {return 0;};
| ^~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
https://timsong-cpp.github.io/cppwp/n4868/class.access#general-8 says that 'The
names in a default argument ([dcl.fct.default]) are bound at the point of
declaration, and access is checked at that point rather than at any points of
use of the default argument.'. It seems this should not be rejected.
Also, note that GCC accepts the following case where the default argument field
tries to access a regular private member instead of an overloaded operator:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class X {
friend void friend_set (int);
int a;
};
//this is ok
void friend_set (int i=X().a) {}
void f()
{
X obj;
friend_set ();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Clang, EDG, and ICC accept the code. Please see https://godbolt.org/z/nabdxG9nM