gpt4 book ai didi

c++ - 声明在早期友元定义中定义的友元函数

转载 作者:行者123 更新时间:2023-11-30 01:03:17 27 4
gpt4 key购买 nike

下面在全局命名空间中定义了一个友元函数,并将该函数声明为友元

class Cls {
friend void func(int) { }
friend void ::func(int);
};

clang accepts这个,同时gcc rejects

so.cpp:3:17: error: ‘void func(int)’ has not been declared within ‘::’
friend void ::func(int);
^~
so.cpp:2:17: note: only here as a ‘friend’
friend void func(int) { }
^~~~

这看起来对我来说应该没问题,它在全局命名空间中定义了一个函数,不是吗? gcc 错误非常明确地表明不喜欢它只是成为 friend 。谁是对的?

最佳答案

来自[namespace.memdef]/3 :

The friend declaration does not by itself make the name visible to unqualified lookup or qualified lookup.

声明:

friend void func(int) { }

确实在全局命名空间中声明名称func。但是,无论是非限定查找还是限定查找都无法找到该名称。它只能通过 ADL 找到(由于参数是 int,意味着根本找不到它 Casey 是铁眼无情的导弹人)。

让普通查找找到此 func 的唯一方法是在类主体之外另外为其提供声明。

gcc 拒绝是正确的。

关于c++ - 声明在早期友元定义中定义的友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54055638/

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