為了提高寫入資料的性能std::string,C 23專門resize_and_overwrite()為std::string. 在[string.capacity] 中,標準描述如下:
template<class Operation> constexpr void resize_and_overwrite(size_type n, Operation op);
讓
—
o = size()在呼叫 之前resize_and_overwrite。——
k是min(o, n)。-
p是一個charT*,使得所述范圍[p,p n]是有效的,this->compare(0, k, p, k) == 0是true在呼叫之前。[p k,p n]范圍內的值可能不確定[basic.indet]。-
OP是運算式std::move(op)(p, n)。—
r = OP。[...]
- 效果:計算
OP,*this用 [p,p r)替換 的內容,并使所有指向范圍 [p,p n] 的指標和參考無效。
但是我發現這個函式在呼叫它之前會std::move用來轉換op成一個右值,這意味著我們不能傳入一個只有左值多載的可呼叫物件operator()(demo):
#include <string>
int main() {
struct Op {
int operator()(char*, int) &;
int operator()(char*, int) && = delete;
} op;
std::string s;
s.resize_and_overwrite(42, op); // ill-formed
}
這種行為看起來有點奇怪,但既然是在上一版的論文中進行了這種更改,顯然是故意的。
那么,這背后的考量是什么呢?授權中是否有任何op必須作為右值呼叫的好處?
uj5u.com熱心網友回復:
op在銷毀之前只呼叫一次,因此將其稱為右值允許對其進行任何&&多載以重用它可能擁有的任何資源。
可呼叫物件在道德上是一個 xvalue——它是“過期的”,因為它在呼叫后立即被銷毀。如果您專門將可呼叫物件設計為僅支持作為左值呼叫,那么庫很樂意通過阻止它作業來提供幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/323632.html
