: → 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++ 下