我想问为什么as_const
禁止右值参数,according to cppreference.com (即为什么标准人员这样做,而不是为什么cppreference.com在这方面特别引用他们。也不在规范中规范委员会的意图的地方,只是为了确保:)。这个(人工的)例子会产生一个错误(用户想让它保持安静)
QChar c = as_const(getQString())[0];
Another question's answer指出,如果我们只是删除了右值引用重载的删除,它将静默地将右值转换为左值。对,但为什么不优雅地处理右值,并为右值输入返回常量右值,为左值输入返回常量左值呢?
发布于 2016-08-20 15:23:09
一个原因可能是,由于缺乏所有权转移,这在rvalue上可能是危险的。
for (auto const &&value : as_const(getQString())) // whoops!
{
}
而且可能没有令人信服的用例来证明忽略这种可能性是合理的。
发布于 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);
}
这涉及到额外的构造,也许还有其他陷阱。
发布于 2016-08-20 15:25:42
因为as_const不接受参数作为常量引用。非常量左值引用不能绑定到临时变量。
转发引用过载被显式删除。
https://stackoverflow.com/questions/39051460
复制相似问题