递归宇宙飞船操作员



我已经写了这个简单的代码,但它没有编译,因为比较被隐式删除了。

struct Tree {
std::vector<Tree> child;
friend auto operator<=>(const Tree &a, const Tree &b) = default;
}
int main(){
Tree t;
std::cout<<(t<t)<<std::endl;
}

有人能向我解释一下如何解决这个问题,或者至少解释一下为什么它不起作用吗?

编辑:使用"g++-std=gnu++2amain.cpp";第2版:这是输出的错误部分(后面有很多行候选(:

main.cpp: In function 'int main()':
main.cpp:31:25: error: use of deleted function 'constexpr auto operator<=>(const Tree&, const Tree&)'
31 |     std::cout << (tmp < tmp) << std::endl;
|                         ^~~
main.cpp:12:17: note: 'constexpr auto operator<=>(const Tree&, const Tree&)' is implicitly deleted because the default definition would be ill-formed:
12 |     friend auto operator<=>(const Tree &a, const Tree &b) = default;
|                 ^~~~~~~~
main.cpp:12:17: error: no match for 'operator<=>' (operand types are 'std::vector<Tree>' and 'std::vector<Tree>')

通常不能定义具有推导返回类型的递归函数。为了推导它,你需要已经知道它,所以这是不可能的。

用显式返回类型std::weak_ordering替换auto可以修复此问题。

最新更新