C 不能從乘號自動推導出乘等於的用意是什麼?

時間 2021-05-30 00:12:08

1樓:

因為a*=b和a=a*b不等價,不等價在效率上以string的+為例, 一般而言a+=b可以在 的時間內完成,而a=a+b則需要

這看起來沒什麼大不了的,但是當連線多個字串時複雜度是不同的,比如說下面的b[i]是單個字元

for(

inti=0

;i

i++)a

+=b[i

]for

(inti=

0;i

i++)a

=a+b

[i]上面的複雜度就是字串長度的和,而下面的複雜度則會達到這意味著當連線數百萬個字元時,上面只需要幾秒,而下面可能需要好幾個小時

2樓:大衛德劉

a = a*b會觸發乘法並生成乙個臨時物件,然後再觸發一次移動賦值或者拷貝賦值

a *= b 可以直接在a內部完成

兩者的語義不等價

3樓:靈劍

就是最開始設計的時候沒這麼設計而已。像Python就有預設的原位操作符定義,重寫了*自動就能用*=了。

C++發展的也很快,考慮到比較運算子已經可以一定程度上自動生成了,也許後面的版本就會有用黑科技自動推導一些通常有聯絡的運算子的方法了。

4樓:「已登出」

如果T沒有operator=函式或者不可用,那麼推導出來的*=就是錯的。

C++20之前,操作符過載必須顯式定義,而且一一對應,清晰明了,定義了就有,否則就沒有。

C++20增加<=>操作符,可隱式提供< <= > >= == !=等操作符,這些操作符都有乙個特點就是都是const的函式,不依賴其他函式或操作符。

5樓:飛翔的荷蘭豬

第一,不是通用行為,並不是每乙個乘等於都可以通過乘變換得到,比如Eigen為了實現延後求值所寫的表示式型別。

第二,有更好的解決辦法,比如crtp

6樓:白東傑

從兩點解釋:

不得不吐糟知乎這個編譯器,跟 MarkDown 比差遠了,什麼智熄的序號功能啊這是,pu

第一點,a = a*b 的自動生成方法對「自定義型別」而言不一定是高效的解決方案,甚至可能得到錯誤的結果,這取決於類的特點。退而求其次的,我認為一般相反,人們更願意先定義 *= 運算子,然後從其中推導出 *:

Toperator*(

Tconst&a

,Tconst&b

)第二點,運算子過載的繁瑣性的確是個問題。C++20 引入了 <=> 運算子來在一定程度上改善這個狀況。類似的,Effective Modern C++ 中提到使用 clone 來簡化建構函式等也算一種策略。

總之,隨著 C++ 的發展,的確可能如題主所願,標準會將自動生成(Code Snippet)等功能整合到 C++ Core 或標準庫中去。但我覺得這還需要很長時間。

相親真的不能從朋友開始嗎?

小洛克李 可以但是很難,大多數女方,在相親上對待男方,都做不到普通朋友的言行舉止和尺度,基本都會以失敗告終。相親和自由戀愛還是有區別的。 打工人是乾飯人 從朋友開始?那我問你你是對每乙個朋友,都噓寒問暖,關懷備至,沒事就自掏腰包叫著吃吃喝喝嘍?你回答是,說明你是個海王,而且每個月都花好幾千請朋友吃飯...

C語言如何實現陣列的自增長?

王飛 template void Array reallocate unsigned int new size T old data data data new T new size allocated new size int end used new size used new size for...

為什麼表演魔術的水箱不能從外面開啟

一般來說,裡面的鎖肯定比外面的鎖質量要好。而如果出現問題不能開鎖,多數情況都只可能是鎖的問題 魔術師出問題?天天提著腦袋練習的東西會出問題?那麼既然裡面的都打不開,開外面的自然也不太可能了。再者,錘子直接敲碎玻璃不比用鑰匙開鎖有效率?反正演出都失敗了,怎麼救命快怎麼來呀。主要是乙個救援效率的問題 一...