繁体   English   中英

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

[英]Ambiguous operator overload for std::optional?

考虑这个代码。

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>这是...一个非常具体的约束。


您可以通过将一个或另一个Test强制转换为optional<int> ,或简单地提供optional==(Test, Test)来解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM