C 11之後返回std vector時會自動呼叫std move嘛?

時間 2021-05-07 06:11:35

1樓:Cooder

編譯器會做優化

C++ Core Guidelines

注意如果函式返回加了const,會起反作用(返回容器加const本身也很奇怪)

2樓:

一般編譯器會應用

RVO(Return Value Optimization)和NRVO(Named Return Value Optimization)規則

去掉2個臨時變數的構造和拷貝,直接在接收物件上進行構造, 所以不需要用到move語義。

3樓:Starve Jokes

準確說,推薦的做法是返回值時不要加std::move。

C++17及以上:拷貝省略 Copy elision - cppreference.com

C++11及以上:返回值優化(RVO, return value optimization)。這個規則超複雜,而且和編譯器支援有關。

加了std::move後會妨礙上面的優化。

不加std::move即使上面的優化不發生,(當返回的「變數」的生命週期在函式外失效時)也會進行move construction而非copy construction

-- 上面加粗部分舉個反向例子 --

struct

stringstream

string

str()

&&// C++20

//僅作示意,不代表std::stringstream內部結構string

buf;};

c 11中std unique ptr需要明確知道型別的析構函式,而shared ptr不需要?

土地測量員 詳細講一下std unique ptr的部分吧。std unique ptr需要明確知道型別的析構函式 unique ptr型別是 template class T,class Deleter std default delete class unique ptr private T p...

C 11為什麼引入nullptr?

徐辰 因為C 他爹早就看0這個magic number不爽了,當年沒顧上搞,一直拖到2011年了,再不瘋狂一把C 就沒人用了。 enpeng xu 問題的關鍵是c 不知道怎麼正確做void 到 T 的預設轉換,所以多此一舉的引入了nullptr。某些情況做下c 編譯器不知道怎麼把 void ptr正...

C 11 模板引數推導(Template Argument Deduction)是如何工作的?

electrlife 關於模版推導,借題主地盤,請教下如下情況如何理解?template class MyVector private T aa int main int argc,const char argv 這裡本意是請問 push back 的const 在推導過程是不是會重複const c...