Почему аргументы size_t в объявлении шаблона должны быть константными? - PullRequest
1 голос
/ 24 апреля 2010

Я могу иметь

std::bitset< 10 > bitsetA;

или

const size_t LengthB = 20;
std::bitset< LengthB > bitsetB;

без проблем.

Но, если длина не const

size_t LengthC = 30;
std::bitset< LengthC > bitsetC;  // Line 30, say

У меня возникает следующая ошибка компиляции

'LengthC' cannot appear in a constant-expression
template argument 1 is invalid

В чем причина?

В чем будет проблема, для компилятора и для кода пользователя, если строка 30 будет принята? Это потому, что у LengthC может быть псевдоним?

Ответы [ 4 ]

7 голосов
/ 24 апреля 2010

Шаблоны создают новые типы на основе параметров их шаблонов, что делается во время компиляции. Вы не можете создавать новые типы во время выполнения, потому что C ++ статически типизирован.

Поэтому, когда у вас есть неконстантная переменная, она не может быть передана в качестве параметра шаблона, поскольку не может быть гарантировано, что это значение (возможно, вам придется "создать экземпляр нового типа во время выполнения «). Только когда это const, вы гарантируете, что значение действительно постоянное и, следовательно, может использоваться в параметре шаблона.

4 голосов
/ 24 апреля 2010

Аргументы шаблона должны быть объявлены const во время компиляции, чтобы шаблон мог быть создан во время компиляции.

В приведенном вами примере действительно кажется, что LengthC не изменится с точки инициализации до точки, где должен быть создан экземпляр шаблона, поэтому его можно рассматривать как константу, но компилятор не обязан это выяснять. В спецификации сказано, что аргументы должны быть объявлены const, поэтому анализ управления потоком во время компиляции не требуется.

1 голос
/ 24 апреля 2010

C ++ компиляторы строгие , когда дело доходит до const приведения.

И 10, и const size_t LengthB = 20; оцениваются как постоянные.без ключевого слова const компилятор не может легко определить, может ли переменная изменяться между объявлением и использованием.

1 голос
/ 24 апреля 2010

Шаблоны - существа во время компиляции - переменные во время выполнения. Если вам нужно передать переменную в шаблон, вы должны сделать это во время выполнения, например, в конструкторе шаблонного класса.

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