константная переменная в качестве нетипичного параметра шаблона (VARIABLE не может появляться в константе-выражении) - PullRequest
8 голосов
/ 08 февраля 2012

Почему это работает?

char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;

Но это (с постоянной переменной) нет?

const char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;

Ошибка компилятора:

Ошибка: '__nontype'не может появиться в константном выражении

ошибка: неверный аргумент шаблона 2

Ответы [ 2 ]

6 голосов
/ 08 февраля 2012

Разница в том, что const влияет на связь.Это работает, если вы добавите extern.Тем не менее, насколько я могу судить:

14.3.2 Аргументы не типового шаблона [temp.arg.nontype]

Аргумент шаблона нетипичного типа,шаблонный параметр non-template должен иметь одно из следующих значений:

  • целочисленное константное выражение (включая константное выражение литерального типа класса, которое можно использовать как целочисленное константное выражение, как описано в 5.19);или
  • имя нетипового шаблона-параметра;или
  • константное выражение (5.19), которое обозначает адрес объекта со статической продолжительностью хранения и внешней или внутренней связью или функцию с внешней или внутренней связью, включая шаблоны функций и идентификаторы шаблонов функций, но исключая нестатические члены класса, выраженные (игнорируя скобки) как & id-выражение, за исключением того, что & может быть опущено, если имя относится к функции или массиву, и должно быть опущено, если соответствующий параметр шаблона является ссылкой;или
  • константное выражение, которое оценивается как нулевое значение указателя (4.10);или
  • константное выражение, которое оценивается как нулевое значение указателя на член (4.11);или
  • указатель на член, выраженный как описано в 5.3.1.

, он также должен работать без extern.Объекту разрешено иметь внутреннюю связь, но ваш компилятор пока не поддерживает это.Это одно из изменений в C ++ 11, предыдущий стандарт C ++ не допускал этого.

1 голос
/ 08 февраля 2012

Ошибка говорит об этом: результат не является константным выражением (он известен во время компоновки, но не во время компиляции).

Вот пример того, что будет работать :

typedef const char *nontype_t;
template <nontype_t> struct Y {};

char hello[] = "hello";
constexpr char* world = hello;

int main()
{
    Y<hello> a;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...