首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::as_const(T &V)不能移动-返回其论点?

为什么std::as_const(T &V)不能移动-返回其论点?
EN

Stack Overflow用户
提问于 2021-01-14 09:47:59
回答 1查看 206关注 0票数 4

阅读Why does as_const forbid rvalue arguments?,我明白我们不能将rvalue-ref转换为lvalue-ref,当然。

但是为什么不将rvalue-ref移动到一个值中并返回它,即?

代码语言:javascript
复制
template<typename T> 
const T as_const(T&& val) { return std::move(val); } 

这也应该与COW容器很好地工作,因为返回的值是const,迭代器不会导致它分离。

也许一些上帝会回答这个问题,但我想不出一个特定的场景,而且在AFAIK中也没有很容易获得的奶牛容器。

更新:

考虑一下这个牛容器(忽略线程问题):

代码语言:javascript
复制
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); 
   }
   ...
};

移动速度很快,返回的const T将在range for-循环中使用时选择begin()的const版本。

还有一些容器将自己标记为已修改,这样它们的更改就可以通过网络发送或稍后同步到另一个副本(用于另一个线程),f.ex。在OpenSG中。

EN

回答 1

Stack Overflow用户

发布于 2021-01-14 10:27:08

我认为这是一个额外的特性,但要避免一些措施:获得一个具有地址的内容的const视图。

而且,由于临时地址没有地址,因此也不应该有const视图。

移动值而不是仅仅添加const将改变它的语义(我们已经有了std::move)

如果一个临时的as_const会延长它自己的生存期,那么如果不绑定它就会浪费空间,例如:

代码语言:javascript
复制
{
   as_const(f()); // if the lifetime would be extended
...
 } // not bound, but space wasted

例如,as_constconst添加到,而不是类型,因此它保存了一些类型,如static_castadd_const等。

将const lvalue ref绑定到临时的Normaly将延长临时生存期,例如:

代码语言:javascript
复制
int f() { return 3; }

{
   const auto& x = f();
    ... use x .. ok
}

但是像这样的东西最终会变成一个悬空的引用:

代码语言:javascript
复制
{
   auto& x = as_const(f()); // one could wrongly think that temporary lifetime is extended, but it's not
    ... x dangles ..
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65716682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档