![](/img/trans.png)
[英]Can static_const<size_t>(), std::as_const() or static_cast<const size_t>() be used to declare an array?
[英]Why can't std::as_const(T &&v) move-return its argument?
閱讀為什么 as_const 禁止右值 arguments? 我知道我們當然不能將右值引用轉換為左值引用。
但是為什么不將右值引用移動到一個值中並返回它,即?
template<typename T>
const T as_const(T&& val) { return std::move(val); }
這應該也適用於 COW 容器,因為返回值是 const 並且來自它的迭代器不會導致它分離。
也許一些 godbol-ing 會回答這個問題,但我想不出一個給定的場景,而且 AFAIK 那里沒有容易獲得的 COW 容器。
更新:
考慮這個 COW 容器(忽略線程問題):
class mything {
std::shared_ptr<std::vector<int>> _contents;
auto begin() { if (_contents.use_count() > 1) { detach(); }
return _contents->begin(); }
auto begin() const { return _contents->begin(); }
void detach() {
_contents = std::make_shared<decltype(_contents)>(*_contents);
}
...
};
Move 會很快,返回的 const T 將是 select 用於 range-for-loop 時 begin() 的 const 版本。
還有一些容器將自己標記為已修改,這樣它們的更改就可以通過網絡發送或稍后同步到另一個副本(用於另一個線程),f.ex。 在 OpenSG 中。
我將其理解為一項附加功能,但要避免一些措施:獲取具有地址的內容的常量視圖。
而且因為臨時沒有地址,所以也不應該有它的常量視圖。
移動值而不是僅僅添加 const 會改變它的語義(我們已經有了std::move
)
如果臨時的 as_const 會自行延長它的生命周期,那么如果沒有綁定它就會浪費空間,例如:
{
as_const(f()); // if the lifetime would be extended
...
} // not bound, but space wasted
例如as_const
將const添加到value而不是type ,因此它節省了一些類型,如static_cast
, add_const
等。
通常將 const 左值 ref 綁定到臨時值,會延長臨時值的生命周期,例如:
int f() { return 3; }
{
const auto& x = f();
... use x .. ok
}
但是像這樣的事情會以懸空引用結束:
{
auto& x = as_const(f()); // one could wrongly think that temporary lifetime is extended, but it's not
... x dangles ..
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.