为什么转换为引用会干扰转换为布尔
Why does conversion to reference interfere with conversion to bool?
似乎如果我有一个到引用的转换运算符,那么这个运算符将优先于到bool
的转换。为什么会发生这种情况,我该如何解决?
(如果重要的话,我使用的是GCC 4.5。我在ideone上验证了GCC-4.7.2也发现了相同的行为。)
假设如下:
class B {
protected:
const int a_;
int b_;
B (int b, int a) : a_(a), b_(b) {}
public:
operator bool () const { return b_ == a_; }
};
class D1 : public B {
public:
D1 (int b = 0, int a = 0) : B(b, a) {}
operator int () const { return b_; }
};
class D2 : public B {
public:
D2 (int b = 0, int a = 0) : B(b, a) {}
operator int & () { return b_; }
};
然后,假设它们被用在一个简单的程序中,比如:
int main () {
if (D1 d1a = D1('a', 'a')) std::cout << "d1an";
if (D1 d1b = D1('b', 'a')) std::cout << "d1bn";
if (D2 d2a = D2('a', 'a')) std::cout << "d2an";
if (D2 d2b = D2('b', 'a')) std::cout << "d2bn";
return 0;
}
该程序的输出为:
d1a
d2a
d2b
请注意,d1b
不在输出中,这意味着对bool
的转换与我对D1
的预期一样。但是,对于D2
,向引用类型的转换似乎优先于bool
的转换。为什么会发生这种情况?我是否可以对D2
进行简单的更改,以允许bool
转换在if
检查中优先?
目前,我正在使用D1
,并为其添加一个赋值运算符,以实现引用的行为。
实际上,它与int&
无关,而是const
的问题:
operator bool () const { return b_ == a_; }
/* ^^^^^ */
/* vvvvv */
operator int & () { return b_; }
d2a
是D2
,而不是const D2
,因此非常数转换运算符更适合。如果你把它写成
operator const int & () const { return b_; }
你会得到预期的行为,看http://ideone.com/vPPPYV.
请注意,即使使用对象的const
版本,operator const int&
也不会干扰,以下几行仍然会导致预期的行为(请参阅http://ideone.com/DTE0xH):
if (const D1 d1a = D1('a', 'a')) std::cout << "d1an";
if (const D1 d1b = D1('b', 'a')) std::cout << "d1bn";
if (const D2 d2a = D2('a', 'a')) std::cout << "d2an";
if (const D2 d2b = D2('b', 'a')) std::cout << "d2bn";
此
D1 d1a = D1('a', 'a');
D1 d1b = D1('b', 'a');
D2 d2a = D2('a', 'a');
D2 d2b = D2('b', 'a');
if (d1a) std::cout << "d1an";
if (d1b) std::cout << "d1bn";
if (d2a) std::cout << "d2an";
if (d2b) std::cout << "d2bn";
打印
d1ad2a
你有
if (D2 d2a = D2('a', 'a')) std::cout << "d2an";
if (D2 d2a = D2('b', 'a')) std::cout << "d2bn";
如果在两种情况下都不使用相同的名称,会发生什么?如果我用替换第4个if,则输出中只有d1a
和d2a
if (D2 d2b = D2('b', 'a')) std::cout << "d2bn";
相关文章:
- 变量定义到C++布尔值转换
- fstream / ifstream / ofstream 对象如何转换为布尔值
- 将uintptr_t转换为布尔值会使 SSO 基准速度减慢数倍
- 将参数隐式强制转换为布尔
- 将uint64_t位掩码转换为 std::布尔数组
- 在目标 c++ 中将 CFTypeRef 转换为布尔值
- 无法将'Class::operator=='从"布尔"类型(类::)(类*)转换为"布尔"类型
- n-ary布尔语法从中缀到前缀的Boost::Spirit转换?
- isspace 函数的性能警告,从 int 转换为布尔值
- 将返回表达式隐式转换为布尔值
- 将结构转换为布尔值
- 整数在 C++ 中没有被类型转换为布尔值
- 为什么我的变体将 std::string 转换为布尔值
- 为什么使用 int 的转换,而不是布尔值
- lambda 转换为布尔值,而不是推导函数指针类型
- 从常量字符串到布尔值的隐式强制转换
- 我无法将'2D array whit bool'转换为"空 2D 数组布尔值"(用于生命游戏)
- 尝试将字符串变量转换为布尔值会导致 "true" 和 "false" 都等于 0
- Typedef shared_ptr转换为<T>布尔值
- 正在缩小MSVC中到布尔警告的转换范围