我想问为什么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?
问题是处理终身扩展
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)
这涉及额外的建设,也许还有其他陷阱.
一个原因可能是由于缺乏所有权转移,它可能对价值造成危险
for (auto const &&value : as_const(getQString())) // whoops!
{
}
Run Code Online (Sandbox Code Playgroud)
并且可能没有令人信服的用例来证明无视这种可能性.