我在我正在開發的項目的源代碼上運行PCLint時發現了這個例子。這裏是代碼片段:這是爲什麼編譯,並且是否有編譯器開關可以讓編譯器報告它爲錯誤或警告?
QString foo()
{
return false;
}
我編譯了代碼,並驗證它返回一個空字符串。真正的例子是一大類大的方法,以及地方在一些偏遠如果分支,有這個與世隔絕的
return false;
好吧,這是壞的編碼,可恥的開發(通過使用SVN /怪我所能甚至找出是誰做的:-)),但是,嚴重的是,爲什麼編譯器不會抱怨呢?
我的理論是,編譯器將
return false;
到
return QString(((const char *) false));
不過,我沒有看到所有的編譯器來推斷這個執行的基本步驟。它首先嚐試QString的所有構造函數,並發現
QString(const * char);
但是呢?它如何確定它可以從布爾到const char *。或者它是否會在你使用一個指針所在的布爾的任何時候自動地將一個布爾值轉換爲任何指針類型?
問題的第二部分。由於所有這些隱式類型轉換都是相當危險的(爲什麼開發人員會寫'return false',如果它們意味着「返回一個空字符串」?),有沒有辦法(例如編譯器開關),以至少報告這種情況作爲警告?我試過了 - 用g ++編譯,並沒有打印任何警告。
編輯
謝謝你的提示。虛假似乎有特殊待遇。如果我做
return true;
我得到:
error: conversion from ‘bool’ to non-scalar type ‘QString’ requested
我使用G ++ 4.4.3在Ubuntu。正如在不同的評論中指出的那樣,其他編譯器報告了這個問題。
鏗鏘有關它的警告,有一個這樣的情況。 – Dani
GCC(至少4.5)**沒有**警告它。 – Mat
在這裏爲'explicit'構造函數插入插件。 –