0
#include <compare>
#include <forward_list>

template<typename T>
struct A
{
    std::forward_list<T> l;
};

template<typename T>
auto operator<=>(const A<T>& lhs, const A<T>& rhs)
{
    return lhs.l <=> rhs.l;
}

int main()
{
    std::forward_list<int>{} < std::forward_list<int>{}; // ok

    A<int>{} < A<int>{}; // error
}

编译clang++ -std=c++20 -stdlib=libc++ main.cpp和错误消息:

main.cpp:13:18: error: invalid operands to binary expression ('const std::forward_list<int>' and 'const std::forward_list<int>')
    return lhs.l <=> rhs.l;
           ~~~~~ ^   ~~~~~
main.cpp:20:14: note: in instantiation of function template specialization 'operator<=><int>' requested here
    A<int>{} < A<int>{}; // error

为什么全球飞船运营商的行为不符合预期?

4

1 回答 1

4

libc++(或任何标准库)似乎还没有完全实现宇宙飞船运算符库的添加。

有关libc++ 的信息,请参见此处,cppreference.com的已编译表请参见此处。operator<=>添加到的相关论文std::forward_list是P1614。

如果您查看 libc++ 的源代码std::forward_list here,您会看到operator<=>尚未提及,并且其他辅助比较运算符仍然是无条件定义的(在 C++20 中不应该是这种情况)。

std::forward_list<int>{} < std::forward_list<int>{};编译是因为它使用operator<,而不是operator<=>. 如果您std::forward_list<int>{} <=> std::forward_list<int>{}直接尝试,它也会失败(在 libc++ 的当前状态下)。

于 2020-04-08T08:41:35.717 回答