指向全局运算符的函数指针在 VC++ 上编译,而 clang 给出错误
Function pointer to global operator compiles on VC++ while clang gives an error
我正在尝试获取以下代码以在 clang 上编译,但它失败并出现以下错误:
error: no member named 'operator<' in the global namespace
我尝试使用/Za 编译视觉工作室代码以切换到标准一致性,但它似乎仍然接受它。请开导我。
struct A
{
int m_test;
A(int test)
: m_test(test)
{
}
friend bool operator<(A left, A right);
};
int main()
{
typedef bool(*TCompare)(A,A);
TCompare compare = &::operator<;
compare(9,7);
}
VC++ 输出:https://godbolt.org/g/LAz56n
叮当输出:https://godbolt.org/g/zC2InO
Clang 是正确的。对于示例代码,友元声明引入的名称operator<
确实成为全局命名空间的成员,但名称查找不可见。它只能通过 ADL 找到,但 ADL 仅适用于函数调用表达式,而&::operator<
则不适用于。
非本地类
X
中的友元声明引入的名称 成为X
最内层封闭命名空间的成员,但它们确实如此 对查找不可见(既不合格也不合格) 除非在命名空间范围内提供了匹配的声明,否则 在类定义之前或之后。这样的名称可以通过 ADL 同时考虑命名空间和类。
要修复它,您必须在全局命名空间范围内添加一个匹配的声明。
struct A
{
int m_test;
A(int test)
: m_test(test)
{
}
friend bool operator<(A left, A right);
};
// add a matching declaration at namespace scope
bool operator<(A left, A right);
int main()
{
typedef bool(*TCompare)(A,A);
TCompare compare = &::operator<;
compare(9,7);
}
bool operator<(A left, A right) {
...
}
这是一个
VC++错误。代码无效。
友元声明不会将声明的名称引入全局命名空间。您仍然需要在类外部声明它。
相关文章:
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- clang 插件:在编译过程中修改 AST
- 错误:使用 clang 没有可行的重载,使用 GCC 编译
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 通过自制软件(macOS)安装的clang++:编译错误
- 在使用 Clang 编译 DLL 时指定 DEF 文件
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何在 clang 的自动会议中检查支持编译标志
- constexpr 使用 clang 编译 TensorFlow 时出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 如何更改 clang 的预编译头文件的路径
- 除了说明符神秘地破坏编译(Clang,GCC不同意)
- VS 代码显示编译 clang 的错误消息
- 同一段代码,可以用 xcode 或使用 g++ 编译,在终端中编译 clang++,不能使用 gcc 或 clang 编
- 简单的 constexpr 函数无法使用 GCC 编译(clang 没问题)
- 在 C++14 模式下为 libstdc++ 编译 clang 正则表达式程序会导致错误
- 如何在Windows上编译Clang
- 在Windows中编译Clang插件
- 是否可以在内存中使用Clang c++ API编译Clang源代码?