问题很简单:为什么不能对数组使用propagate_const
?
以下行给出错误:
std::experimental::propagate_const<std::unique_ptr<int[]>> ptr = std::make_unique<int[]>(1);
错误(gcc 13.0版):
/usr/local/include/c++/13.0.0/experimental/propagate_const: In Instanziierung von »struct std::experimental::fundamentals_v2::__propagate_const_conversions<std::unique_ptr<int []> >«:
/usr/local/include/c++/13.0.0/experimental/propagate_const:108:11: erfordert durch »class std::experimental::fundamentals_v2::propagate_const<std::unique_ptr<int []> >«
../../livews2223/l00/main.cpp:182:64: von hier erfordert
/usr/local/include/c++/13.0.0/experimental/propagate_const:55:37: Fehler: no match for »operator*« (operand type is »std::unique_ptr<int []>«)
55 | = remove_reference_t<decltype(*std::declval<_Tp&>())>;
| ^~~~~~~~~~~~~~~~~~~~~
目标是防止const元素函数更改数组元素,如下所示:
struct A {
void foo() const {
a[0] = 2; // should not be possible
}
// std::experimental::propagate_const<std::unique_ptr<int[]>> a = std::make_unique<int[]>(2);
std::unique_ptr<int[]> a = std::make_unique<int[]>(2);
};
1条答案
按热度按时间qv7cva1a1#
unique_ptr<T[]>
既不是指针类型,也不是类似指针的类型。它是一个类似 array 的类型。这就是为什么它有operator[]
而没有operator*
。在数组上使用*ptr
没有什么意义(对于语言数组,这将访问第一个元素,但使用ptr[0]
会使情况更清楚)。因此unique_ptr<T[]>
没有提供这样的运算符。因此,
propagate_const
不像指针那样工作。