[英]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
const char*
隱式轉換為bool
而不是std::string
,盡管構造函數需要explicit
類型? 因為從const char*
到bool
的隱式轉換被限定為標准轉換,而const char*
到std::string
是用戶定義的轉換。 前者排名較高,在 重載決議中勝出。
標准轉換序列始終優於用戶定義的轉換序列或省略號轉換序列。
順便說一句: mystruct obj(c);
執行直接初始化,包括mystruct::mystruct(bool)
在內的explicit
轉換構造函數也被考慮在內。 結果, c
被轉換為bool
然后傳遞給mystruct::mystruct(bool)
作為構造obj
的參數。
直接初始化比復制初始化更寬松:復制初始化只考慮非顯式構造函數和非顯式用戶定義轉換函數,而直接初始化考慮所有構造函數和所有用戶定義轉換函數。
關於explicit
說明符,
“為什么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.