我正在考虑在已经使用C ++ 11功能的代码中用explicit operator bool
替换所有安全bool习语的实例(因此旧编译器不识别显式转换运算符的事实并不重要) ,所以我想知道它是否会引起一些微妙的问题。
因此,所有是什么可能的不相容性(即使是最微小的)也可能是由旧的和沉闷的安全bool习语转换为新的闪亮的explicit operator bool
?
答案 0 :(得分:4)
假设您的代码没有错误(我知道,不是一个安全的假设),可能最大的区别在于,在某些情况下,您可能希望隐式转换为bool
。 explicit
转化功能不匹配。
struct S1
{
operator S1*() { return 0; } /* I know, not the best possible type */
} s1;
struct S2
{
explicit operator bool() { return false; }
} s2;
void f()
{
bool b1 = s1; /* okay */
bool b2 = s2; /* not okay */
}
答案 1 :(得分:3)
如果您在代码中错误地使用了safe-bool转换,则只有explicit operator bool
不兼容,因为它不允许您轻松地做错误的操作。否则,它应该没问题。事实上,即使出现问题,您仍应切换到explicit operator bool
,因为如果您这样做,那么您可以确定使用safe-bool转换时的问题。
根据this article,一些编译器使用成员函数指针发出低效的安全bool实现指令,
当人们开始使用这个习惯用法时,发现某些编译器存在效率损失 - 成员函数指针导致编译器头痛,导致获取地址时执行速度变慢。虽然差别很小,但目前的做法通常是使用成员数据指针而不是成员函数指针。