当前位置: 首页 > 知识库问答 >
问题:

常量std::array和std::array

戚云
2023-03-14

两者之间有实际区别吗

std::array<const T, N>

const std::array<T, N>

?

看起来包含常量元素的非常量数组仍然无法交换,赋值运算符也不起作用<我什么时候应该选择一个而不是另一个?

#include <array>

std::array<const int, 5> array_of_const = {1,2,3,4,5};
std::array<const int, 5> array_of_const2 = {1,2,3,4,5};

const std::array<const int, 5> const_array = {1,2,3,4,5};
const std::array<const int, 5> const_array2 = {1,2,3,4,5};

int main()
{
    // Assignment doesn't work for either
    array_of_const = array_of_const2;
    const_array = const_array2;

    // Swapping doesn't work for either
    array_of_const.swap(array_of_const2);
    const_array.swap(const_array2);

    // Indexing...
    array_of_const[0] = 0;
    const_array[0] = 0;


    return 0;
};

共有3个答案

孔安阳
2023-03-14

它们确实是不同的类型,因此您不能在一个地方使用其中一个,而不管另一个是预期的,例如在函数调用或赋值中。

也就是说,由于数组是一个固定大小的容器,没有辅助数据成员,因此让容器常量阻止对其元素的任何更改,而让元素常量不允许对容器进行任何更改,因为它显然没有其他数据成员。

换言之,这两种类型将具有完全相同的有效和无效操作。

我能想到的主要区别是const_cast含义:数组可以(隐式)转换为相同元素类型的const数组,但不能转换为const-modified类型的数组:

std::array<int, 3> a {1, 2, 3};

std::array<const int, 3> b = a; // Error: no known conversion from 'array<int, [...]>' to 'const array<const int, [...]>
const std::array<int, 3> c = a; // Ok
颜君浩
2023-03-14

当您需要将变量传递给其他函数时,可能至少存在一种不同情况,例如:

#include <array>

std::array<const int, 5> cc_arr5 = {1,2,3,4,5};
const std::array<int, 5> cc_arr5_2 = {1,2,3,4,5};

template<class T, std::size_t N>
void func(std::array<T, N>& a) {
    // do not change a, for example just calculate sum
}

int main()
{
    func(cc_arr5);
    func(cc_arr5_2); // this line does not compile

    return 0;
};
扶冠宇
2023-03-14

复制std::array

它们匹配的模板存在差异,例如伊利亚回答中的案例。

 类似资料:
  • 在过去的几个月里,我一直在学习C语言并使用终端。我的代码使用g和c11编译并运行得很好,但在过去几天里它开始出现错误,此后我在编译时遇到了问题。我唯一可以编译和运行的程序依赖于旧的C标准。 我第一次遇到的错误包括 尝试使用ecg$g-o stoi_试验stoi_试验编译。cpp-std=c 11 大堆cpp:13:22:错误:命名空间“std”中没有名为“stoi”的成员;你是说“阿托伊”吗?in

  • 并行开发挺复杂的,特别是在试图用好线程和锁的过程中。如果要用到条件变量或std-atomics(一种无锁开发方式),那就更复杂了。C++0x提供了future和promise来简化任务线程间的返回值操作;同时为启动任务线程提供了packaged_task以方便操作。其中的关键点是允许2个任务间使用无(显式)锁的方式进行值传递;标准库帮你高效的做好这些了。基本思路很简单:当一个任务需要向父线程(启动

  • 标准库函数bind()和function()定义于头文件<functional>中(该头文件还包括许多其他函数对象),用于处理函数及函数参数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。)例如: int

  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var

  • 我试图创建一个查找表,以便轻松创建具有不同值的对象。为此,我需要在类中使用一个静态std::数组填充数据。目前看起来是这样的: 它工作正常,如果我删除std::字符串,但与std::字符串我得到编译错误