c++ 对数组使用'std::experimental::propagate_const'

vd8tlhqk  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(158)

问题很简单:为什么不能对数组使用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);    
};
qv7cva1a

qv7cva1a1#

unique_ptr<T[]>既不是指针类型,也不是类似指针的类型。它是一个类似 array 的类型。这就是为什么它有operator[]而没有operator*。在数组上使用*ptr没有什么意义(对于语言数组,这将访问第一个元素,但使用ptr[0]会使情况更清楚)。因此unique_ptr<T[]>没有提供这样的运算符。
因此,propagate_const不像指针那样工作。

相关问题