为什么不能声明的朋友函数有默认参数?

Cod*_*key 3 c++11

我已经了解到,除非友元声明是一个定义,否则C++ 11标准不允许友元函数具有默认参数.所以这是不允许的:

class bar
{
    friend int foo(int seed = 0);
};

inline int foo(int seed) { return seed; }
Run Code Online (Sandbox Code Playgroud)

但这是:

class bar
{
    friend int foo(int seed = 0)
    {
        return seed;
    }
};
Run Code Online (Sandbox Code Playgroud)

(示例礼貌http://clang-developers.42468.n3.nabble.com/Clang-compile-error-td4033809.html)

这个决定背后的理性是什么?具有默认参数的Friend函数很有用,例如,如果函数太复杂而无法就地声明,为什么它们现在被禁止?

Ada*_*son 5

在查看DR 136时,看起来好友声明与名称空间级声明结合使用默认参数会导致语义很难推理(并且可能很难发出高质量诊断),特别是在模板环境中.在该页面上给出的DR解决方案是,当声明是程序中唯一的声明时,它只允许默认参数.由于函数定义也是一个声明,这意味着在友元声明中指定默认参数的唯一有用方法是使其成为一个定义.我猜测C++ 11标准只是选择明确这个实际使用要求.

(从技术上讲,如果用"程序"表示"翻译单元",可以构建一个完整的程序,其中函数是在完全不同的翻译单元中定义的,但由于该函数的定义不具有可见的类定义,因此友谊补助基本没用.)

这次打嗝的解决方法似乎非常简单.在不使用默认参数的情况下声明朋友,然后在命名空间范围内再次声明它,并使用所需的默认参数.