const boost :: array <t,n>或boost :: array <const t,n =“”>?</const> </t,n>

时间:2011-04-09 09:04:22

标签: c++ arrays const

这两者有什么区别?当您需要固定大小的常量值数组时,您更喜欢哪一个?

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

感谢。

3 个答案:

答案 0 :(得分:6)

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

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

由于我希望它可以工作,我可能会选择第一个选项。将第二个传递给期望boost::array<T, N>的模板将阻止这些模板修改其参数(即使它是副本)。第一个将“正常工作”,因为参数将具有类型boost::array<int, 2>

答案 1 :(得分:2)

这真的是一种风格上的差异。

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

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

答案 2 :(得分:0)

此上下文中的const intint几乎相同。您无法对array<int,2>执行任何操作,而array<const int, 2>无法对int执行任何操作。如果不是array<const MyClass, 2>你有一些课程,那么就会有所不同。使用const array<MyClass, 2>,您将无法在数组的元素上调用非const方法 operator[]更强大,因为你不能修改任何东西。你不能调用元素的非const方法,你不能通过替换元素来改变数组本身,比如使用{{1}}。