[問題] 關於c++11 ctor行為

作者: a58524andy (a58524andy)   2018-06-23 18:10:49
開發平台(Platform): (Ex: Win10, Linux, ...)
win10 1803 [email protected]
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
c++11
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
<iostream>
問題(Question):
有兩個相似的case,煩請參照外部連結閱讀;編譯以及執行的選項如下
$ g++ -c my_PTT_post.cc
作者: bluesoul (忙死你老爸)   2018-06-23 18:50:00
1你的理解是對的
作者: KanzakiHAria (神崎・H・アリア)   2018-06-23 20:25:00
縮寫看得很不舒服 Constructor就打完整一個物件實體化第一次的=不會使用operator=所以第一次=會呼叫constructormove可能慢的原因為複製成本太低std::move是一個function 所以還是會有離開回來例如int 型態還特地調用move就會造成過多的搬移成本move最值得使用的情境為:當一個需要deep copy的物件要用來初始化別人,這時候move就不需要copy但是如果這個東西之後還要繼續用就無法使用move那只好回到使用copy簡單說可以想像類似搬進去function的scope離開function 的時候這個東西會destruct
作者: legendmtg (CLANNAD)   2018-06-23 20:37:00
ctor是很慣用的縮寫吧
作者: chchwy (mat)   2018-06-23 20:41:00
並沒有什麼實體化第一次不呼叫operator=的規則那是因為編譯器開了RVO 你把RVO關掉就可以看見正確行為然後ctor/dtor根本就超常見
作者: Feis (永遠睡不著 @@)   2018-06-24 01:09:00
名字
作者: BlazarArc (Midnight Sun)   2018-06-24 01:19:00
ctor很常見的縮寫
作者: Feis (永遠睡不著 @@)   2018-06-24 01:25:00
case 2. reference (cp), std::move (mv)
作者: steve1012 (steve)   2018-06-24 03:46:00
ctor 很ok的
作者: KanzakiHAria (神崎・H・アリア)   2018-06-24 06:20:00
你在講什麼?constructor的return是void哪有甚麼回傳function return都是rvalue 建構子也是我終於看懂你的問題了......因為你的g不是回傳reference type當然不會動到reference的constructor阿......你的問題是連最基本的三種呼叫和回傳都沒搞懂call by value, call by address,call by reference
作者: firose (guest也是也是也是也是也)   2018-06-24 07:04:00
這問題 (https://bit.ly/2K5zUvu) 也有人問但沒答案感覺他是 xvalue 應該能安全 move 才對
作者: KanzakiHAria (神崎・H・アリア)   2018-06-24 07:34:00
因為在function內scope是lvalue reference也就是原PO的22行還要使用move才會cast回rvalue reference
作者: firose (guest也是也是也是也是也)   2018-06-24 07:53:00
問題是 case1 也是 lvalue 就可以 move
作者: KanzakiHAria (神崎・H・アリア)   2018-06-24 07:58:00
所以是RVO關不掉?RVO是c++11的standard名稱是copy elision我把原PO的code改了一下 http://cpp.sh/4u43728行VS報錯內容'return': cannot convert from 'myClass' to 'myClass &&'Clang報錯內容rvalue reference to type 'myClass' cannot bind to lvalue of type 'myClass'
作者: loveflames (咕啾咕啾魔法陣)   2018-06-24 10:40:00
return語句為非靜態物件名稱時,才以move取代copy,rvalue ref並不是一個物件還有樓上那個錯誤訊息是因為decltype(auto)是推導出myClass &&不是你以為的myClass你可以把h函數想成這樣

Links booklink

Contact Us: admin [ a t ] ucptt.com