初始化list<char*>遇到的錯誤
記錄一個今天寫C++遇到的一個錯誤,代碼是這樣的:
list<char *> list = { "hello", "world" };
vector<string> v;
v.assign(list.begin(), list.end());
編寫過程中做的類型檢查並沒有提示任何錯誤,一眼看過去也沒什麼問題,但是並不能通過編譯,錯誤信息是下面這個:
C2440 “初始化”: 無法從“_Ty”轉換爲“_Objty”
可惜我才疏學淺,並不能看懂
於是就想隨便試一試,給初始化列表多加了幾個值,然後類型檢查就出現了錯誤,這樣問題就清晰起來了。上面的第一條語句因爲不能作爲合適的初始化列表,因此被編譯器當成:
list<char *> list("hello", "world");
因爲"hello"的類型是char *,而begin(“hello”)的類型也是char *,所以上面這條語句實際調用的是接受迭代器類型的構造函數
直觀一些,這條語句等價於:
list<char *> list(begin("hello"), end("world"));
而實際上這兩個地址並非指向同一個對象的不同元素,因此這個初始化的結果自然不對。
問題的根源在於沒辦法把 const char* 轉換爲 char*
感覺還蠻隱蔽的,要是多寫或者少寫幾個元素都不會碰到這個結果hhh