这是向无法更改其指向的值的非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
编辑:
如果指针已经存在(我想是更常见的用例)怎么办?我们需要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
不要使事情复杂化。刚做
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
的设计中甚至根本没有考虑过。