Re: [问题] G++ and VC++ Constructor 问题

楼主: LPH66 (-6.2598534e+18f)   2017-06-01 23:22:31
: → 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++ 下
作者: Killercat (杀人猫™)   2017-06-01 23:23:00
诶,要14喔 XD 我以为这东西是11的另外我一时眼残看错 拍写 XD
楼主: LPH66 (-6.2598534e+18f)   2017-06-01 23:25:00
literal suffix 在 11 就有了, 但 ""s 是 14 才有11 没有定义标准的 literal suffix
作者: ROGZ (ROGZ)   2017-06-01 23:50:00
感谢您的解答但虽然说是Copy Initialization,但试着写一下Copy Constructor和overload assignment operator后,却发现它都没有使用到,所以原则上来说A a = string("123")和A a("123")是执行类似的动作去construct A吧但是,A a("123")能把"123"视为string,而A a = string("123")却只能视为const char*上面写错了,应该是A a = "123",被视为const char*
作者: djshen (djshen)   2017-06-02 00:20:00
不是视为string 是implicit conversionen.cppreference.com/w/cpp/language/copy_initialization有提到the implicit conversion in copy-initializationmust produce T directly from the initializer还有The equals sign, =, in copy-initialization of anamed variable is not related to the assignmentoperator
作者: ROGZ (ROGZ)   2017-06-02 00:29:00
感谢djshen大的资料,有比较了解了
作者: hunandy14 (Charlott.HonG)   2017-06-02 00:49:00
同问 int i=0; 与 int i(0); 前者也是有复制?在C上后者并不能这样写是否只在 C++ 才具 copy init 在 C 是 D init?或是 两者都是 copy init
作者: steve1012 (steve)   2017-06-02 01:22:00
用=会呼叫copy constructor. C没有研究但c没有constructor 吧
作者: djshen (djshen)   2017-06-02 01:36:00
built-in type就直接standard conversion了吧?
作者: steve1012 (steve)   2017-06-02 03:27:00
对耶是int
作者: boy770329 (A-So)   2017-06-02 08:04:00
A="123"在有支援copy elision的compiler是不会做copy的吧
楼主: LPH66 (-6.2598534e+18f)   2017-06-02 10:06:00
> 没有呼叫 ctor 的问题这就是为什么我原文加了个 (至少语意上) 的括号因为这里是标准允许实作可以不 copy 的地方(即是所谓的 copy elision)当要 copy 的来源物件是个刚生成的物件时标准允许这里跳过一次复制让那物件在复制目的地直接生成
作者: james1022jk (雁)   2017-06-02 11:16:00
ctor在单一引数时有一些规则
作者: loveflames (咕啾咕啾魔法阵)   2017-06-02 11:58:00
函数返回也有一样的问题
作者: hunandy14 (Charlott.HonG)   2017-06-03 14:15:00
了解~感谢

Links booklink

Contact Us: admin [ a t ] ucptt.com