<=> 运算符对 x86 和 arm 的行为不同



我有以下代码在godbolt上正确编译:

#include <array>
#include <iostream>
template <class T>
class A
{
public:
std::array<T,2> data_;
constexpr friend auto operator<=>(const A<T>& a, const A<T>& b)
{
return  ( a.data_ <=> b.data_ );
}
};
int main()
{
using B = A<int>;
auto a = B{0,0};
auto b = B{1,1};
std::cout << std::boolalpha;
std::cout << (a.data_ <b.data_ );
std::cout << (a<b);
}

同样的程序在Arm Mac上,用

编译
clang++ spacetest.cpp -o spaceship -std=c++20

给出如下错误

spacetest.cpp:11:27: error: invalid operands to binary expression ('const std::array<int, 2>' and 'const std::array<int, 2>')
return  ( a.data_ <=> b.data_ );

编译器版本为

clang++ -v
Homebrew clang version 13.0.0
Target: arm64-apple-darwin21.4.0
Thread model: posix
InstalledDir: /opt/homebrew/opt/llvm/bin

所以,我不知道我做错了什么。欣赏提示。

我认为@cpplearner的评论是正确的。<=>操作符从libstdc++ 10.1版本开始被支持(参见https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2020表1.9)。编译器资源管理器使用v8.2工具链,所以目前还不支持。对于x64,它使用v11.2,所以它是受支持的。

您可以通过在命令行中添加-v编译器标志来检查版本。

最新更新