为什么as_const禁止rvalue参数?

Joh*_*itb 17 c++ rvalue c++17

我想问为什么as_const禁止rvalue参数,根据 cppreference.com(即为什么标准人员这样做,而不是为什么cppreference.com特别引用它们.而且也不是规范中委员会的意图编纂的地方,只是为了确保:))).这个(人为的)示例会产生错误(用户希望使其为const以保持COW安静)

QChar c = as_const(getQString())[0];
Run Code Online (Sandbox Code Playgroud)

另一个问题的答案指出,如果我们删除rvalue引用重载的删除,它会默认将rvalues转换为lvalues.是的,但为什么不优雅地处理rvalues并返回rvalue输入的const rvalues和lvalue输入的const lvalues?

Jar*_*d42 6

问题是处理终身扩展

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

可能是以下过载(而不是删除的过载)

template< typename T >
const T as_const(T&& t) noexcept(noexcept(T(t)))
{
    return t;
}
Run Code Online (Sandbox Code Playgroud)

这涉及额外的建设,也许还有其他陷阱.


Meh*_*dad 5

一个原因可能是由于缺乏所有权转移,它可能对价值造成危险

for (auto const &&value : as_const(getQString()))  // whoops!
{
}
Run Code Online (Sandbox Code Playgroud)

并且可能没有令人信服的用例来证明无视这种可能性.