Приведение указателя в качестве аргумента шаблона: компиляция Comeau и MSVC, сбой GCC - PullRequest
6 голосов
/ 13 сентября 2009

Рассмотрим следующий код:

template<int* a>
class base {};

int main()
{
    base<(int*)0> test;
    return 0;
}

И Comeau, и MSVC компилируют это без проблем (за исключением предупреждения Comeau о неиспользуемой переменной), в то время как GCC завершается ошибкой в ​​строке base<(int*)0> test;, указывая

В функции `int main () ': приведение к типу, отличному от целочисленного или перечислимого, не может появляться в константном выражении

Недопустимый аргумент шаблона 1

На что именно он жалуется? И кто прав - этот код должен компилироваться? Стоит отметить, что моя версия GCC крайне старая (3.4.2), так что может иметь к этому какое-то отношение. Спасибо.

1 Ответ

8 голосов
/ 13 сентября 2009

Из чернового стандарта (выделение добавлено):

14.1.3 A non-type template-parameter shall have one of the following (option-
  ally cv-qualified) types:
  ...
  --<b>pointer to object, accepting an address constant  expression  desig-
    nating a named object with external linkage</b>,
  ...

Очевидно, что создание шаблона с нулевым указателем недопустимо, поскольку нулевой указатель не указывает на «именованный объект с внешней связью».

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