: → ROGZ: 還有,VC是沒問題的, 是g++不行 06/01 22:55
沒仔細看原文 (趴
g++ 給的錯誤訊息是
error: conversion from 'const char*' to non-scalar type 'A' requested
這句話在這裡有點摸不著頭到底為什麼
不過拿一些相關的關鍵字下去 google 時卻讓我發現一件事:
A a = "123"; 這個語法其實是 Copy Initialization 而不是 Direct Initialization
A a("123"); 這個才是 Direct Initialization
兩者之間的差別在於, copy initialization 做的是複製
因此它會把 = 右邊的東西先轉成左邊型態之後呼叫 copy ctor 複製過去 (至少語意上)
發生錯誤的地方就是「轉」這個動作
一邊是個 const char * 另一邊是個物件
所以會去看物件方有沒有目標方定義的轉換, 也就是吃這種型態的 ctor
但 A 並沒有吃 const char * 的 ctor 所以轉不動出現錯誤
這一切在 Direct Initialization 都不會發生
因為那是直接抓 A 的 ctor 做 overload resolution 所以可以隱式轉
更多關於此兩者的差別可以看 GotW #36 http://www.gotw.ca/gotw/036.htm
VC++ 可以過的原因可能是它把這兩者混在一起了...
====
那所以如果 = 右邊的東西是個 string 就可以過了
因為這下右邊能夠「轉」成左邊所以什麼事都沒有
例如以下都是 OK 的:
A a2 = string("123");
A a3 = "123"s; // 這是 C++14 的標準 literal suffix
// 需要 using namespace std::literals;
// 且要對 g++ 下