boost::array<T,N> 和 boost::array<const T,N> 哪个更好?

5
这两者有何不同?当您需要一个固定大小的常量值数组时,您会更喜欢哪个?
const boost::array<int, 2> x = {0, 1};
boost::array<const int, 2> y = {0, 1};

感谢您的信任。
3个回答

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>


谢谢!顺便问一下,为什么按值传递会忽略const限定符?这是因为参数类型推导的原因吗? - pic11
@pic 是的。我认为这是一件好事。请参考http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/上的评论。 - Johannes Schaub - litb
Schaub。是的,这很有道理。谢谢你提供链接。 - pic11

2

这实际上是一种风格上的差异。

如果你尝试在一个const数组上调用assign,编译器将会报错,指出没有匹配的函数。如果你对一个array<const T>执行相同的操作,它会指向assign中的无效操作。

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


我会选择使用const数组。谢谢。 - pic11

0
在这个上下文中,const intint基本上是相同的。对于array<int,2>,你无法做到的事情也同样适用于array<const int, 2>。如果你有一些类而不是int,那么就会有所不同。对于array<const MyClass, 2>,你将无法在数组元素上调用非const方法。
const array<MyClass, 2>更强大,因为你不能修改任何东西。你不能调用元素的非const方法并且你不能通过替换元素来改变数组本身,比如使用operator[]

在另一种选择下,您也无法通过operator[]替换元素。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接