我已经了解到C ++ 11标准不允许友元函数拥有默认参数,除非友元声明是一个定义。所以这是不允许的:
class bar
{
friend int foo(int seed = 0);
};
inline int foo(int seed) { return seed; }
但这是:
class bar
{
friend int foo(int seed = 0)
{
return seed;
}
};
(示例礼貌http://clang-developers.42468.n3.nabble.com/Clang-compile-error-td4033809.html)
这个决定背后的理性是什么?具有默认参数的朋友函数是有用的,例如如果函数太复杂而无法声明,为什么它们现在不被允许?
答案 0 :(得分:5)
在查看DR 136时,看起来好友声明与命名空间级别声明结合使用默认参数会导致语义难以推理(并且可能难以针对其发布质量诊断),特别是在模板的上下文中。在该页面上给出的DR解决方案是,当声明是程序中唯一的声明时,它只允许默认参数。由于函数定义也是一个声明,这意味着在友元声明中指定默认参数的唯一有用方法是使其成为一个定义。我猜测C ++ 11标准只是选择明确这个实际使用要求。
(从技术上讲,如果通过"程序"他们的意思是"翻译单元",可以构建一个完整的程序,其中功能是在一个完全不同的翻译单元中定义的,但是由于这个功能& #39;定义不会使类定义可见,友谊补助的好处在很大程度上是无用的。)
这次打嗝的解决方法看起来非常简单。在不使用默认参数的情况下声明朋友,然后在命名空间范围内再次声明它,并使用任何默认参数。