
[英]How to initialize a non-const attribute of a const object with a const value?
[英]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
编辑:
如果指针已经存在(我认为这是更常见的用例)怎么办? 我们必须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};
一切都很好。
您也可以根据 规范执行此操作:
observer_ptr p{&std::as_const(i)};
但是 GCC 和 Clang 似乎与此处的规范有所不同。 该实现使用(element_type*)
构造函数的限定名称,因此阻止 class 模板参数推导。
很像std::make_pair
, make_observer
存在,是因为库基础 2 TS 是在 C++17 之前的时代创建的。 Class 模板参数推导当时还没有。 如今,我们很少需要像std::make_pair
这样的单独的 make function (反例:引用包装器,请参阅C++1z 中std::make_pair
和std::make_tuple
的有用性),同样我们也很少需要make_observer
。
因此,谈论在 C++17 中使用像observer_ptr
这样的 C++17 之前的功能的“规范”方式没有多大意义。 当然,如果它确实有效,我们可以使用 class 模板参数推导。 在observer_ptr
的设计中根本没有考虑到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.