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