首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么as_const禁止右值参数?

为什么as_const禁止右值参数?
EN

Stack Overflow用户
提问于 2016-08-20 15:03:28
回答 3查看 859关注 0票数 19

我想问为什么as_const禁止右值参数,according to cppreference.com (即为什么标准人员这样做,而不是为什么cppreference.com在这方面特别引用他们。也不在规范中规范委员会的意图的地方,只是为了确保:)。这个(人工的)例子会产生一个错误(用户想让它保持安静)

QChar c = as_const(getQString())[0];

Another question's answer指出,如果我们只是删除了右值引用重载的删除,它将静默地将右值转换为左值。对,但为什么不优雅地处理右值,并为右值输入返回常量右值,为左值输入返回常量左值呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-20 15:23:09

一个原因可能是,由于缺乏所有权转移,这在rvalue上可能是危险的。

for (auto const &&value : as_const(getQString()))  // whoops!
{
}

而且可能没有令人信服的用例来证明忽略这种可能性是合理的。

票数 6
EN

Stack Overflow用户

发布于 2016-08-20 15:47:11

问题是如何处理生命周期扩展

const auto& s = as_const(getQString()); // Create dangling pointer
QChar c = s[0]; // UB :-/

一种可能性是以下重载(而不是被删除的重载)

template< typename T >
const T as_const(T&& t) noexcept(noexcept(T(std::forward<T>(t))))
{
    return std::forward<T>(t);
}

这涉及到额外的构造,也许还有其他陷阱。

票数 7
EN

Stack Overflow用户

发布于 2016-08-20 15:25:42

因为as_const不接受参数作为常量引用。非常量左值引用不能绑定到临时变量。

转发引用过载被显式删除。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39051460

复制
相关文章

相似问题

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