簡體   English   中英

安全bool習語和顯式操作符bool之間的不兼容性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM