c 建構函式引數傳遞應該是常量引用還是值

時間 2021-05-07 20:38:12

1樓:飛翔的荷蘭豬

template

...Ts

,typename

=std

::enable_if_t

is_constructible_v

string,Ts

...>>>A(

T&&...args):

s_(std::

forward

(args

)...){}

c++templates的模板建構函式,不知道跟傳值後move有沒有效能上的區別

2樓:黃亮anthony

綜合所有型別來看考慮,傳值比較安全,效能可以後續優化。

盡量唯讀,用const修飾,包括值型別。

引用型別引數都是可疑的,需要回答必要性和所有權問題。

指標型別,只用於可選引數,或extern 「C「函式。

具體到這個例子,傾向於用string_view

3樓:

const string&, string&, const string, string, std::move(string)每一種都有自己適用的場合,我舉幾個例子。

像下面這個類,本來就是持有string&,指向外部的string,需要引用後者修改它,那肯定就在建構函式中傳string&,而且要自己保證生命週期。

classA;

再看下面乙個類,如果要初始化 str_,引數型別可以用const string&,string&,string,std::move(string)。如果要減少拷貝次數,可以傳std::

move(string),但是前提是傳完以後原來的引數就不能用了(因為已經被move了),如果需要再次使用,還是要傳其它三種方式。

class Bprivate:

string str_;

};其實原則就是在減少拷貝並且保證生命週期沒問題的前提下選擇引數的型別,取捨還是要看自己掌握的程度,還有自己的風格,比如說有些多執行緒環境下,用拷貝比用引用安全。

4樓:d41d8c

不寫建構函式(也就是定義成aggregate type)。

一定要寫建構函式,就不存std::string(用string_view或定長陣列或shared_ptr)。

一定要定義建構函式並且存std::string,就傳const&。

如果還要擠出效率,就加乙個&&過載。

aggregate initialization因為有guaranteed copy elision,是效率最高的方式,其次是&&,只需要一次移動。但是對於很短的字串(僅限std::string),複製等於移動。

傳值+move比&&+move多一次移動。

做題家的最佳身體構造應該是怎麼什麼樣子?

李勇 首先是大容量的高速無損知識傳輸通道,將中國古武術隔代傳功那套加以改進應該能成。然後是高速的知識獲取 消化能力,前段時間的量子讀書法應該能湊合用。最後是足夠長的學習時間,包括壓榨當前已有時間和獲取更多的學習時間。在這方面中國道家仙法走在世界前列。所以 武當山龍虎山三清山少林寺,選擇還挺多的 M3...

為什麼很多 C 粉認為 Void 不應該是型別, 是否大多數 C 使用者都這樣認為

Tracy Liang 我認為不是,如果按照可以定義變數的語法層面講,void a 不合法,所以不認為是乙個型別。但void 是。vb.net就沒有void。void 在cs是用來修飾函式返回值的關鍵字。func name param type type 這種形式的語法完全避開了void的使用。同樣...

守望先鋒裡應該是t位享受更多資源還是c位享受更多資源?

都可以,雙排多排就看溝通了,給能打出配合的隊友效果會最好。然而單排天梯當然是給實力強的,當然連誰實力強都看不出來的混子奶活該hardstuck,因為一把遊戲裡如果資源過多傾斜給了混子,除非對面的人更離譜那一般是挺難打的 從c的角度說說,我單排比較多,大概在3500左右,主源氏鐵拳。一般打完一波團就可...