gpt4 book ai didi

c++ - std::optional 的运算符重载不明确?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:09 26 4
gpt4 key购买 nike

考虑 this代码。

struct Test : public std::optional<int>  { };

Test o1, o2;
o1 == o2;

对于最后一行 gcc-7.0.1 提示 error: ambiguous overload 指向两个重载来比较一个可选值和一个值。但它不应该只选择带有两个可选值的重载并成功编译代码吗?


编辑值比较的重载不应该有“守卫”来禁止它们实例化从 std::optional 继承的类型吗?

最佳答案

将为该表达式找到三个重载:

// #1, with T=int, U=int
template <class T, class U>
constexpr bool operator==(optional<T> const&, optional<U> const& );

// #2, with T=int, U=Test
template <class T, class U>
constexpr bool operator==(optional<T> const&, U const& );

// #3, with T=int, U=Test
template <class T, class U>
constexpr bool operator==(U const&, optional<T> const& );

#2#3具有比 #1 更好的转换序列因为参数之一(U const&)是 Test 的精确匹配而不是派生到基础的转换。

但是虽然我们更喜欢 #2#3#1 , 没有理由选择 #2 之一或 #3到另一个 - 每个参数在一个参数中都有更好的转换序列,在第二个参数中有一个更差的转换序列。

因此,它是模棱两可的。注意 #2#3是合式运算符,因为您确实可以比较 intTest .要消除它们的歧义,您必须另外添加一个约束 U不继承自 optional<T> ,这是......一个非常具体的约束。


您可以通过施放一个或另一个来解决这个问题 Testoptional<int> ,或者只是提供一个 optional==(Test, Test) .

关于c++ - std::optional 的运算符重载不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42928058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com