我了解到,除非朋友声明是一个定义,否则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提供)
这个决定背后的合理性是什么?带有默认参数的Friend函数很有用,例如,如果函数太复杂而无法在适当位置声明,为什么现在不允许使用它们呢?
在查看DR 136时,似乎有一个问题,当朋友声明与带有默认参数的名称空间级别声明结合使用时,尤其是在模板的上下文中,这会使语义难以推理(并且可能难以针对其发出质量诊断信息) 。该页面上建议的DR解决方案是,仅当声明是程序中的唯一参数时,才允许使用默认参数。由于函数定义也是一个声明,因此这意味着在Friendly声明中指定默认参数的唯一有用方法是使其成为一个定义。我猜想C ++ 11标准只是选择使此实际使用要求明确。
(从技术上讲,如果用“程序”来表示“翻译单元”,则可以构建一个完整的程序,其中功能是在完全不同的翻译单元中定义的,但是由于该功能的定义将看不到类定义,因此,友情赠款在很大程度上将毫无用处。)
解决此问题的方法似乎非常简单。声明朋友而不使用默认参数,然后使用所需的默认参数在名称空间范围内再次声明它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句