繁体   English   中英

你应该如何创建一个 std::experimental::observer_ptr 到一个不能改变它指向的值的非常量 object ?

[英]How should you create a std::experimental::observer_ptr to a non-const object that cannot mutate the value it points to?

这是将std::experimental::observer_ptr创建到不能改变它指向的值的非const object 的规范方法吗?

auto i = int{0};

auto p = std::experimental::make_observer(&std::as_const(i));
*p = 1; // compilation error, as desired

https://godbolt.org/z/h3Uq0o

编辑:

如果指针已经存在(我认为这是更常见的用例)怎么办? 我们必须const_cast吗?

auto i = int{0};
auto p = &i;

auto q = std::experimental::make_observer(const_cast<const int*>(p));
*q = 1; // compilation error, as desired

https://godbolt.org/z/NbR6Nj

不要把事情复杂化。 做就是了

observer_ptr<const int> p{&i};

一切都很好。

您也可以根据 规范执行此操作:

observer_ptr p{&std::as_const(i)};

但是 GCC 和 Clang 似乎与此处的规范有所不同。 该实现使用(element_type*)构造函数的限定名称,因此阻止 class 模板参数推导。


很像std::make_pairmake_observer存在,是因为库基础 2 TS 是在 C++17 之前的时代创建的。 Class 模板参数推导当时还没有。 如今,我们很少需要像std::make_pair这样的单独的 make function (反例:引用包装器,请参阅C++1z 中std::make_pairstd::make_tuple的有用性),同样我们也很少需要make_observer

因此,谈论在 C++17 中使用像observer_ptr这样的 C++17 之前的功能的“规范”方式没有多大意义。 当然,如果它确实有效,我们可以使用 class 模板参数推导。 observer_ptr的设计中根本没有考虑到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM