为什么使用转换为 int 而不是 bool?

Why is the conversion to int used, not to bool?

提问人:Daniel Bauer 提问时间:6/13/2019 最后编辑:StoryTeller - Unslander MonicaDaniel Bauer 更新时间:6/13/2019 访问量:82

问:

我为一个班级实现了两次转换。一个是 bool,一个是 int&。

如果我隐式转换为 int,它会使用 int& 转换,但如果我想要一个布尔值,它仍然使用 int& 转换。

struct A
{
    operator bool() const;
    operator int&();
};

// trying to call these:
A a;
int  i_test = a; // calls operator int&()
bool b_test = a; // calls operator int&()

我知道 a 隐式转换为 int&,然后转换为 bool,但为什么它需要更长的路径?我怎样才能避免它而不必写?a.operator bool()

C++ 隐式转换 重载解析

评论

2赞 Scheff's Cat 6/13/2019
a莫。因此,没有一个运算符是完全匹配的。这可能是首选的原因。constint& A::operator()

答:

6赞 StoryTeller - Unslander Monica 6/13/2019 #1

A a;声明一个非常量对象。由于转换函数是一个成员函数,因此它接受指向 的隐式指针。重载解析将选择非常量限定成员,因为它是在非常量对象上调用的。thisa

事实上,触发过载解决的布尔值转换有点红鲱鱼。函数的返回类型 ( 或 ) 仅使它们成为重载解决的候选对象(因为这些将用于转换为 ),但不足以确定重载解决本身的结果。int&boolbool

评论

1赞 Scheff's Cat 6/13/2019
顺便说一句。它甚至这样做,当方法和相应的非方法时。这曾经让我头疼,我记得在 SO 中也找到了相关的 Q/A。constpublicconstprivate
1赞 StoryTeller - Unslander Monica 6/13/2019
@Scheff - 是的,在一个可访问性可能会影响过载解决的世界中,我们可能都会更快乐(或者有其他问题需要处理)。
0赞 Daniel Bauer 6/13/2019
我让它通过删除其 const 限定符来选择布尔转换的实现。现在我想知道我该如何做一些事情,比如让来自 const a 和非 const a 的转换使用相同的函数。operator bool() { return operator bool() const; }
1赞 StoryTeller - Unslander Monica 6/13/2019
@DanielBauer - 共享实现的一种方法是强制转换为 const 对象。要么 .thisreturn std::as_const(*this);return const_cast<A const&>(*this);
0赞 Daniel Bauer 6/13/2019
它现在按照我的预期工作。我正在考虑这个解决方案,但不太确定这是否是这样做的方式。