bool 函數重載中的字串文字歧義
定義同時接受bool 和std::string 參數的重載方法時,開發人員可能會遇到提供字串文字時出現意外行為。優先考慮 bool 重載,而不是呼叫 std::string 重載。
要理解此行為,請考慮以下情況:
<code class="cpp">class Output { public: static void Print(bool value) { std::cout << value ? "True" : "False"; } static void Print(std::string value) { std::cout << value; } }; Output::Print("Hello World");</code>
儘管提供了字串文字,但 Print( ) 呼叫具有 bool 重載的方法。這是因為 C 中的字串文字可以隱式轉換為 bool 值。具體來說,「Hello World」是一個 const char* 數組,可以解釋為指向 const char 的指針,而 const char 可以隱式轉換為 bool。此轉換被視為標準轉換序列。
C 優先考慮標準轉換序列而不是使用者定義的轉換(例如,從 std::string 到 bool 的轉換)。根據 C 標準 (§13.3.3.2/2),標準轉換序列始終被認為是更好的轉換序列。
可以透過向 Print( 明確提供 std::string 參數來變更此行為) 方法:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
以上是為什麼字串文字會觸發函數重載中的“bool”重載?的詳細內容。更多資訊請關注PHP中文網其他相關文章!