C++ 中的不可变列表

Immutable list in C++

如何在cpp中创建不可变列表? 列表的 reference 应该是常量,它的数据

我不会在 vector 或任何其他容器上制作包装器 class(我知道类似于此 article 的方法)。

使用 constexprconst pointers 执行此操作的最佳方法是什么。

只需声明为const,像这样:

const std::list<int> constList = { 1, 2, 3 };

constList.begin(); 这样的方法将 return 一个 const_iterator 而像 constList.push_back(3); 这样的调用将不会编译。

将其地址分配给非常量指针将不起作用:

std::list<int> *l = &constList; // does not compile

传递对采用非常量引用的函数的引用不起作用:

void a(std::list<int> &list) {}
int main()
{
    const std::list<int> mylist = { 1, 2, 3 };
    a(mylist); // does not compile
}

Not modifying the list is not a solution.

创建一个非常量列表,构建完成后,将其移至 const 列表:

std::list<int> mylist = { 1, 2, 3 };
mylist.push_back(4);
const std::list<int> constList = std::move(mylist);

您可以简单地将其用作 const std::list<T>。 以下代码中的两个指针将打印出相同的值。

#include <iostream>
#include <list>

using T = double;

void some_function(const std::list<T>& list) {
    const double * ptr = &(*list.begin());
    std::cout << ptr << "\n";
    //list.push_back(3.0);//error list is const
}

int main() {
    std::list<T> list{3.4,-42};
    const std::list<T>& const_list = list;
    const double * ptr = &(*const_list.begin());
    std::cout << ptr << "\n";
    //const_list.push_back(3.0);//error list is const
    some_function(list);
}

不存在不可变列表..如果你想让任何列表不可变,那就去吧 -> "Create a wrapper named class whatever and create object of stl list inside wrapper class and dont provide any function inside the whatever class and play game with whatever's object..." 现在你的列表是不可变的..