【发布时间】:2017-10-31 15:05:59
【问题描述】:
std::optional::value() 有以下两个重载
constexpr T& value() &;
constexpr const T & value() const &;
constexpr T&& value() &&;
constexpr const T&& value() const &&;
返回 const 右值引用有什么意义?
我能想到的唯一原因是让编译器能够在以下(真的很奇怪)情况下帮助捕捉未定义的行为
auto r = std::cref(const_cast<const std::optional<int>&&>(
std::optional<int>{}).value());
如果std::optional::value() 返回了const T&,那么上面的代码将编译并在稍后使用r reference_wrapper 时导致未定义的行为。
上述返回const T&& 是否有任何其他极端情况?
【问题讨论】:
-
不能相信其他人的知识,但这里有一个链接:nirfriedman.com/2016/01/18/… 在“可选的安全迭代”部分中,有一些关于在何处使用
T&& value()的有用信息。跨度> -
返回对 const 对象的非常量引用是不安全的……返回对可能是临时对象的左值引用也是不安全的……所以,它返回一个 const右值引用
-
您建议的替代方案是什么?非
const右值引用?const左值引用? -
我想知道为什么他们需要添加这个重载而不是只添加一个
const T&重载。如果他们需要,为什么不直接返回const T&?这种重载有一些实际用例吗? -
this 可能重复?归根结底,这个问题只是:
T const&&的意义何在。
标签: c++ c++17 rvalue-reference stdoptional