如何用常量值初始化非常量成员变量


struct IntSlice {
int* ptr_;
int  len_;
};
std::initializer_list<int> xs = {1, 2, 3};
const IntSlice s = {xs.begin(), (int)xs.size()}; // this does not work :(

这给了我一个错误,我们不能将常量指针分配给非常量指针,但我认为声明const IntSlice会解决这个问题。

我想我知道发生了什么。const IntSlice正在将int* ptr_提升为int* const ptr_,而不是我想要的const int* const ptr_

但是,肯定有某种方法可以在不创建ReadonlyIntSlice的情况下将int* ptr_提升为const int*

IntSlice过于具体。它仅适用于(可变的(int切片。为什么不拥有适用于任何类型切片的东西呢?

template <typename T>
struct Slice
{
T*          ptr_;
std::size_t len_;
};

现在,您可以拥有Slice<int>Slice<const int>Slice<const * const double>和其他任何您喜欢的东西。

std::initializer_list<int> xs = {1, 2, 3};
Slice<const int> s = {xs.begin(), xs.size()};

在C++17中,如果添加适当的构造函数或推导指南,则可以省略模板参数。

template <typename T>
Slice(T* ptr, std::size_t len) -> Slice<T>;
Slice s = {xs.begin(), xs.size()};

最新更新