【发布时间】:2021-10-13 10:57:59
【问题描述】:
在下一个示例中,带有私有析构函数的类U 有一个友元函数foo。而这个友元函数的参数类型为U,默认值为U{}:
class U{ ~U(); friend void foo(U); };
void foo(U = {});
Clang 和 MSVC 接受此代码,但 GCC 以错误拒绝它
error: 'U::~U()' is private within this context
2 | void foo(U = {});
| ^
演示:https://gcc.godbolt.org/z/eGxYGdzj3
哪个编译器在这里,友谊是否在 C++ 中的默认参数上扩展?
【问题讨论】:
-
@HolyBlackCat 我也会这么说,但没有编译器在声明
void foo(U);时抱怨 -
@TimRandall 我不确定了,在你回复之前删除了评论......虽然声明本身很好,它在调用之前不需要析构函数。
-
我能找到的最好的是this。不过,这不涉及默认参数不在友元函数体中的可能性,因此无法访问构造函数。
-
U 参数不是在调用
foo的上下文中构造(和破坏)的,它是在调用点作为参数构造的(即使是默认的)。这是参数的默认参数的缺点之一:它们是在调用站点生成的,如果默认更改,调用者必须重新编译以获取更改。
标签: c++ language-lawyer default-value friend