gpt4 book ai didi

友元函数的 C++ 内联定义

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:23 26 4
gpt4 key购买 nike

在 C++ 标准的当前草案中(2019 年 3 月)[class.friend] p.6状态(强调我的):

A function can be defined in a friend declaration of a class if and only if the class is a non-local class ([class.local]), the function name is unqualified, and the function has namespace scope. [...]

“函数具有命名空间作用域”是什么意思?

我能想到的函数没有命名空间作用域的唯一情况如下:

struct A
{
static void f();

struct B
{
friend void f() {};
};
};

但是 clanggcc 都没有关联 B 中的friend 定义A里面的静态方法,而是属于全局命名空间的函数。

还有其他我遗漏的情况吗?

最佳答案

我认为您实际上已经回答了您自己的问题,但没有意识到这一点。

“函数具有命名空间作用域”意味着它是命名空间的一部分,而不是类或结构的一部分。所以函数 A::B::f() 不存在。而且它也不引用 A::f() 。相反,您定义为友元的函数实际上是函数::f(),因为这是它所在的命名空间(全局命名空间)。

我怀疑(但没有尝试过),如果您将所有这些都包装在一个 namespace 中,那么您定义的 f() 将成为该 namespace 的一部分。所以,例如,

namespace ns {
struct A
{
static void f();

struct B
{
friend void f() {};
};
};
}

将友元函数定义为函数 ns::f()。

关于友元函数的 C++ 内联定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com