const boost::array<T,N> or boost::array<const T,N>?

const boost::array<T,N> or boost::array<const T,N>?

本文关键字:gt array const boost lt or      更新时间:2023-10-16

两者有何不同?当你需要一个固定大小的常量数组时,你会选择哪一个?

const boost::array<int, 2> x = {0, 1};
boost::array<const int, 2> y = {0, 1};

谢谢。

第二个选项将阻止您将其复制到新的非const数组

boost::array<const int, 2> y = {0, 1};
boost::array<int, 2> y1 = y; // error!

因为我希望这能起作用,所以我可能会选择第一个选项。将第二个参数传递给期望boost::array<T, N>的模板将阻止这些模板修改它们的参数(即使它是一个副本)。第一个"刚刚工作",因为参数的类型是boost::array<int, 2>

真是风格上的不同。

如果您尝试在const array上调用assign,编译器错误提示没有匹配的函数。如果您对array<const T>执行相同的操作,它将指向assign内部的无效操作。

我认为const array更好地表达了意图,看起来更像相应的c风格数组声明。但是我不会努力去改变一些东西,例如在遗留代码中或在可能生成array<const T>的模板中。

在这种情况下,const intint几乎是相同的。你对array<int,2>所能做的,对array<const int, 2>所不能做的。如果不是int,你有一些类,那么就会有区别。在array<const MyClass, 2>中,不能对数组的元素调用非const方法。
const array<MyClass, 2>更强,因为你不能修改任何东西。你不能调用元素的非const方法,你不能通过替换元素来改变数组本身,比如使用operator[]