【发布时间】:2018-11-21 10:11:47
【问题描述】:
我有一个类,在类头中定义了一个友元函数。当我对这个友元函数进行 using 声明时,它在 MSVC2017 中有效,但在 GCC 8.2 或 Clang 7.0 中均无效。谁是对的?这是godbolt链接(https://godbolt.org/z/_7MVlh),这里是代码:
namespace vec {
class Vec {
friend Vec vec_max(const Vec& a, const Vec& b) { return a; }
};
}
void test() {
using vec::vec_max;
}
GCC 在 using 声明中给出错误:“错误:命名空间 'vec' 中没有名为 'vec_max' 的成员”。 Clang 给出了类似的信息。 MSVC 按预期编译它。
根据我的理解 vec_max 应该位于 vec 命名空间中,MSVC 应该是正确的。但是标准中可能有一些微妙的文字,使得对 gcc 和 clang 的更严格解释是正确的(尽管不太直观)。
【问题讨论】:
-
friend在一个类中内联定义的函数只能通过该类的 ADL 找到,所以这里 MSVC 是错误的。
标签: c++ declaration using friend