const boost :: array <T, N> или boost :: array <const T, N>? - PullRequest
5 голосов
/ 09 апреля 2011

В чем разница между этими двумя? Какой из них вы бы предпочли, когда вам нужен массив постоянных значений фиксированного размера?

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

Спасибо.

Ответы [ 3 ]

6 голосов
/ 09 апреля 2011

Второй не позволит скопировать его в новый неконстантный массив

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

Поскольку я ожидал, что это сработает, я, вероятно, выбрал бы первый вариант. Передача второго в шаблоны, которые ожидают boost::array<T, N>, не позволит этим шаблонам изменять свой параметр (даже если это копия). Первый будет «просто работать», так как параметр будет иметь тип boost::array<int, 2>.

2 голосов
/ 09 апреля 2011

Это действительно стилистическая разница.

Если вы попытаетесь вызвать assign для const array, ошибка компилятора говорит о том, что не существует соответствующей функции.Если вы сделаете то же самое с array<const T>, оно будет указывать на недопустимую операцию внутри assign.

Я думаю, const array лучше выражает намерение и больше похоже на объявление соответствующего массива в стиле CНо я бы не стал пытаться что-то изменить, например, в устаревшем коде или в шаблоне, который может генерировать array<const T>.

0 голосов
/ 09 апреля 2011

A const int и int в этом контексте практически одинаковы. Вы ничего не можете сделать с array<int,2>, что вы не можете сделать с array<const int, 2>. Если вместо int у вас есть какой-то класс, тогда будет разница. с array<const MyClass, 2> вы не сможете вызывать неконстантные методы для элементов массива.
const array<MyClass, 2> сильнее в том смысле, что вы не можете ничего изменить, как раньше. Вы не можете вызывать неконстантные методы элементов и , вы не можете изменять сам массив путем замены элементов, например, используя operator[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...