C++11 为什么可以';t声明只有友元函数有默认参数?

C++11 为什么可以';t声明只有友元函数有默认参数?,c++11,C++11,我了解到,除非友元声明是一个定义,否则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; } }; (示例礼貌) 这一决定背后的理性是什么?

我了解到,除非友元声明是一个定义,否则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;
    }
};
(示例礼貌)

这一决定背后的理性是什么?带有默认参数的友元函数很有用,例如,如果函数太复杂而无法就地声明,为什么现在不允许使用它们?

在研究中,友元声明与带有默认参数的命名空间级声明组合时,似乎存在一些问题,这使得语义难以解释(可能难以发布质量诊断),尤其是在模板的上下文中。该页上给出的建议DR解决方案是,当声明是程序中唯一的声明时,只允许在声明中使用默认参数。由于函数定义也是声明,这意味着在友元声明中指定默认参数的唯一有用方法是将其定义为definit我猜C++11标准只是选择了明确这个实际使用需求

(从技术上讲,如果“程序”的意思是“翻译单元”,则可以构建一个完整的程序,其中函数在一个完全不同的翻译单元中定义,但由于该函数的定义不会显示类定义,因此友谊补助金的好处在很大程度上是无用的。)

解决这个问题的方法似乎非常简单。在不使用默认参数的情况下声明friend,然后在命名空间范围内使用所需的任何默认参数再次声明它