1

如何在cpp中制作不可变列表?列表的引用和它的数据一样应该是常量。

我不会在 vector 或任何其他容器上创建包装类(我知道类似于本文的方法)。

constexpr使用or的最佳方法是什么const pointers

4

3 回答 3

7

Just declare it as const, like this:

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

Methods like constList.begin(); will return a const_iterator and calls like constList.push_back(3); will not compile.

Assigning its address to a non-const pointer won't work:

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

Passing a reference to a function that takes a non-const reference doesn't work:

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.

Make a non-const list, and once you're done building it, move it to a const list:

std::list<int> mylist = { 1, 2, 3 };
mylist.push_back(4);
const std::list<int> constList = std::move(mylist);
于 2019-10-21T08:51:19.863 回答
1

您可以简单地将其用作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);
}
于 2019-10-21T08:55:24.373 回答
-1

不存在不可变列表..如果您想使任何列表不可变,那么就去做->“创建一个名为 class 的包装器,并在包装​​器类中创建 stl 列表的对象,并且不要在任何类中提供任何函数并玩游戏无论是什么对象......”现在你的列表是不可变的......

于 2020-01-11T09:23:28.480 回答