[英]Operator overloading and implicit conversion to bool in relation to safe bool idiom
[英]Incompatibilities between safe bool idiom and explicit operator bool
我正在考慮用已經使用C ++ 11特性的代碼中的explicit operator bool
替換所有安全bool習語的實例(因此老編譯器不識別顯式轉換運算符的事實並不重要),所以我想想知道它是否會引起一些微妙的問題。
因此,從舊的和沉悶的安全bool成語切換到新的閃亮的explicit operator bool
可能導致的所有可能的不兼容性(即使是最微小的那些)?
編輯:我知道切換是一個好主意,因為后者是一種語言功能,編譯器很好理解,因此它的工作並不比實際上只是一個黑客更糟糕。 我只是想知道可能存在的差異。
假設您的代碼沒有錯誤(我知道,不是一個安全的假設),可能是最大的區別,在某些情況下,您可能希望隱式轉換為完全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 */
}
如果您在代碼中錯誤地使用了safe-bool轉換,那么只有explicit operator bool
才會不兼容,因為它不允許您輕易地做錯誤的操作。 否則,它應該沒問題。 事實上,即使存在問題,您仍應切換到explicit operator bool
,因為如果這樣做,那么您可以確定使用safe-bool轉換時的問題。
根據這篇文章 ,一些編譯器使用成員函數指針發出低效的安全bool實現指令,
當人們開始使用這個習慣用法時,發現某些編譯器存在效率損失 - 成員函數指針導致編譯器頭痛,導致獲取地址時執行速度變慢。 雖然差別很小,但目前的做法通常是使用成員數據指針而不是成員函數指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.