0

这是创建一个不能改变它指向的值std::experimental::observer_ptr的非对象的规范方法吗?const

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

4

1 回答 1

-1

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

observer_ptr<const int> p{&i};

一切都很好。

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

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

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


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

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

于 2019-10-06T02:09:10.767 回答