您应该如何为无法使指向其值的非常量对象创建std :: experimental :: observer_ptr?

问题描述 投票:0回答:1

这是向无法更改其指向的值的非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

c++ const smart-pointers c++-standard-library c++-ts
1个回答
-1
投票

不要使事情复杂化。刚做

observer_ptr<const int> p{&i};

一切都很好。

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

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

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


std::make_pair相似,make_observer之所以存在是因为库基本原理2 TS是在C ++ 17之前的时代创建的。在那时,类模板参数的推论还不是一件容易的事。如今,我们很少需要像std::make_pair这样的单独make函数(反例:参考包装,请参见Usefulness of std::make_pair and std::make_tuple in C++1z),类似地,我们几乎不需要std::make_pair

因此,谈论使用C ++ 17之前的功能(如C ++ 17中的std::make_tuple)的“规范”方式没有多大意义。当然,我们可以使用类模板参数推导(如果确实可行)。在make_observer的设计中甚至根本没有考虑过。

© www.soinside.com 2019 - 2024. All rights reserved.