簡體   English   中英

為什么 const char* 隱式轉換為 bool 而不是 std::string?

[英]Why const char* implicitly converted to bool rather than std::string?

#include <iostream>
#include <string>

struct mystruct{
     mystruct(std::string s){
        
        std::cout<<__FUNCTION__ <<" String "<<s;
    }
    
     explicit mystruct(bool s) {
        
        std::cout<<__FUNCTION__<<" Bool "<<s;
    }
};


int main()
{
    
    const char* c ="hello";
    
    mystruct obj(c);

    return 0;
}

output:

mystruct Bool 1
  1. 為什么const char*隱式轉換為bool而不是std::string ,盡管構造函數需要explicit類型?
  2. 隱式轉換優先級如何應用在這里?

因為從const char*bool的隱式轉換被限定為標准轉換,而const char*std::string是用戶定義的轉換。 前者排名較高,在 重載決議中勝出。

標准轉換序列始終優於用戶定義的轉換序列或省略號轉換序列。

順便說一句: mystruct obj(c); 執行直接初始化,包括mystruct::mystruct(bool)在內的explicit轉換構造函數也被考慮在內。 結果, c被轉換為bool然后傳遞給mystruct::mystruct(bool)作為構造obj的參數。

直接初始化比復制初始化更寬松:復制初始化只考慮非顯式構造函數和非顯式用戶定義轉換函數,而直接初始化考慮所有構造函數和所有用戶定義轉換函數。

關於explicit說明符

  1. 指定構造函數or conversion function (since C++11) or deduction guide (since C++17)是顯式的,也就是說,它不能用於隱式轉換復制初始化

“為什么const char*隱式轉換為bool而不是std::string ,盡管構造函數需要explicit類型?”:

  • 標准轉換優先於用戶定義的轉換。

char const*是一個指向常量字符的指針,並且指針可以隱式轉換為bool :如果它是nullptr ,則將其轉換為false ,否則轉換為true

  • 您曾經在檢查指針是否為NULL的情況下看到這種有效的轉換,所以如果它不是nulptr我們安全地取消引用它,否則它具有nullptr值因此取消引用它是不正確的:

     int* ptr = nullptr; if(ptr) // false because ptr has nullptr or NULL or 0 or 0x000000 address value std::cout << ptr << '\t' << *ptr << '\n'; // not executed ptr = new int(10); // valid and non-nullptr if(ptr) // non-nullptr so condition succeeds std::cout << ptr << '\t' << *ptr << '\n'; // 0FED155 10 delete ptr; // free memory
  • explicit構造函數意味着它只能被顯式調用,唯一的方法是通過直接初始化,就像你的情況一樣:

     mystruct obj(c); // direct initialization mystruct obj = c; // copy-initialization. Error: constructor myStruct(bool) is `explicit`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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