2011-04-09 92 views

回答

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>

+0

谢谢!顺便说一句,为什么通过值忽略const限定符?参数类型演绎是如何工作的? – pic11 2011-04-09 12:45:22

+0

@pic是。它认为这是一件好事。请参阅http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/ – 2011-04-09 12:50:50

+0

Schaub上的评论。是的,它非常有意义。感谢您的链接。 – pic11 2011-04-09 12:55:08

0

A const intint在这方面是几乎相同的。你无法对array<int,2>做任何事,你无法做到array<const int, 2>。如果不是int你有一些课程,那么会有区别。与array<const MyClass, 2>你将无法调用数组元素的非const方法。
const array<MyClass, 2>更强,你不能修改任何东西。您不能调用元素的非const方法,您不能通过替换元素来改变阵列本身,比如使用operator[]

+0

您无法通过其他选择下的operator []'来替换元素。 – Potatoswatter 2011-04-09 09:19:54

2

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

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

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

+0

我会去** const array **。谢谢。 – pic11 2011-04-09 09:53:17

相关问题