Cur*_*ous 7 c++ rvalue-reference c++17 stdoptional
std::optional::value() 有两个以上的重载
constexpr T& value() &;
constexpr const T & value() const &;
constexpr T&& value() &&;
constexpr const T&& value() const &&;
Run Code Online (Sandbox Code Playgroud)
返回const右值引用有什么意义?
我能想到的唯一原因是使编译器能够帮助捕获未完成的行为(真的很奇怪),如下所示
auto r = std::cref(const_cast<const std::optional<int>&&>(
std::optional<int>{}).value());
Run Code Online (Sandbox Code Playgroud)
如果std::optional::value()已返回a,const T&则上述代码将编译,并在r reference_wrapper以后使用时导致未定义的行为.
以上返回的是否有任何其他角落案例const T&&?
当然.你有一个const optional<T>结构.您返回一个rvalue实例并访问可选成员.
由于您的构造方式,您可以保证在这种情况下可选.所以你打电话value().该类型T包含mutable可以有效重用/被盗的状态.在T const&&过载使消费功能权限窃取状态.
struct mutable_type {
mutable std::vector<char> cache;
};
struct test_type {
const std::optional<mutable_type> bob;
};
test_type factory( int x ) {
if (x==0) return {};
return {mutable_type({{1,2,x}})};
}
auto moved_into = factory(3).bob.value().cache;
Run Code Online (Sandbox Code Playgroud)
我相信,这会移动vector内部bob,这const在这种情况下是一个左值.它依赖于在上下文中value()返回a .const&&const&&