簡體   English   中英

為什么 std::as_const(T &&v) 不能移動返回它的參數?

[英]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_constconst添加到value而不是type ,因此它節省了一些類型,如static_castadd_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM