Re: [問題] G++ and VC++ Constructor 問題

看板C_and_CPP (C/C++)作者 (かつて交わした約束)時間7年前 (2017/06/01 23:22), 7年前編輯推噓4(4035)
留言39則, 9人參與, 最新討論串3/3 (看更多)
: → 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++ 下 --std=c++14 // 特點就是雖然寫 "" 但型態卻是 string 而非 const char * -- ˊ_▂▃▄▂_ˋ. ◣          ▅▅ ▅▅ ι●╮   ./◤_▂▃▄▂_◥ \'▊   HARUHI █████ <■┘   ◤◤◥█◥◥█Δ   ISM    By-gamejye ¢|\   ▌▌ζ(▏●‵◥′●)Ψ ▏           █    ⊿Δ    /|▋ |\ ▎         ハルヒ主義      ▄█ ◥◥|◣ ‵′ ◢/'◢◢S.O.S 世界をいに盛り上げるための宮ハルヒの    -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.29.238 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1496330554.A.570.html

06/01 23:23, , 1F
誒,要14喔 XD 我以為這東西是11的
06/01 23:23, 1F

06/01 23:24, , 2F
另外我一時眼殘看錯 拍寫 XD
06/01 23:24, 2F
※ 編輯: LPH66 (180.177.29.238), 06/01/2017 23:24:57

06/01 23:25, , 3F
literal suffix 在 11 就有了, 但 ""s 是 14 才有
06/01 23:25, 3F

06/01 23:26, , 4F
11 沒有定義標準的 literal suffix
06/01 23:26, 4F

06/01 23:50, , 5F
感謝您的解答
06/01 23:50, 5F

06/01 23:52, , 6F
但雖然說是Copy Initialization,但試著寫一下Copy Construc
06/01 23:52, 6F

06/01 23:54, , 7F
tor和overload assignment operator後,卻發現它都沒有使用
06/01 23:54, 7F

06/01 23:57, , 8F
到,所以原則上來說A a = string("123")和A a("123")是執行
06/01 23:57, 8F

06/01 23:58, , 9F
類似的動作去construct A吧
06/01 23:58, 9F

06/02 00:02, , 10F
但是,A a("123")能把"123"視為string,而A a = string("123
06/02 00:02, 10F

06/02 00:02, , 11F
")卻只能視為const char*
06/02 00:02, 11F

06/02 00:07, , 12F
上面寫錯了,應該是A a = "123",被視為const char*
06/02 00:07, 12F

06/02 00:20, , 13F
不是視為string 是implicit conversion
06/02 00:20, 13F

06/02 00:24, , 14F
en.cppreference.com/w/cpp/language/copy_initialization
06/02 00:24, 14F

06/02 00:24, , 15F
有提到the implicit conversion in copy-initialization
06/02 00:24, 15F

06/02 00:24, , 16F
must produce T directly from the initializer
06/02 00:24, 16F

06/02 00:25, , 17F
還有The equals sign, =, in copy-initialization of a
06/02 00:25, 17F

06/02 00:25, , 18F
named variable is not related to the assignment
06/02 00:25, 18F

06/02 00:25, , 19F
operator
06/02 00:25, 19F

06/02 00:29, , 20F
感謝djshen大的資料,有比較了解了
06/02 00:29, 20F

06/02 00:49, , 21F
同問 int i=0; 與 int i(0); 前者也是有複製?
06/02 00:49, 21F

06/02 00:50, , 22F
在C上後者並不能這樣寫
06/02 00:50, 22F

06/02 00:51, , 23F
是否只在 C++ 才具 copy init 在 C 是 D init?
06/02 00:51, 23F

06/02 00:51, , 24F
或是 兩者都是 copy init
06/02 00:51, 24F

06/02 01:22, , 25F
用=會呼叫copy constructor. C沒有研究但c沒有construc
06/02 01:22, 25F

06/02 01:22, , 26F
tor 吧
06/02 01:22, 26F

06/02 01:36, , 27F
built-in type就直接standard conversion了吧?
06/02 01:36, 27F

06/02 03:27, , 28F
對耶是int
06/02 03:27, 28F

06/02 08:04, , 29F
A="123"在有支援copy elision的compiler是不會做copy
06/02 08:04, 29F

06/02 08:04, , 30F
的吧
06/02 08:04, 30F

06/02 10:06, , 31F
> 沒有呼叫 ctor 的問題
06/02 10:06, 31F

06/02 10:07, , 32F
這就是為什麼我原文加了個 (至少語意上) 的括號
06/02 10:07, 32F

06/02 10:07, , 33F
因為這裡是標準允許實作可以不 copy 的地方
06/02 10:07, 33F

06/02 10:07, , 34F
(即是所謂的 copy elision)
06/02 10:07, 34F

06/02 10:08, , 35F
當要 copy 的來源物件是個剛生成的物件時
06/02 10:08, 35F

06/02 10:09, , 36F
標準允許這裡跳過一次複製讓那物件在複製目的地直接生成
06/02 10:09, 36F

06/02 11:16, , 37F
ctor在單一引數時有一些規則
06/02 11:16, 37F

06/02 11:58, , 38F
函數返回也有一樣的問題
06/02 11:58, 38F

06/03 14:15, , 39F
了解~感謝
06/03 14:15, 39F
文章代碼(AID): #1PC34wLm (C_and_CPP)
文章代碼(AID): #1PC34wLm (C_and_CPP)