Создает ли приведение к указателю на шаблон экземпляр этого шаблона?

static_cast *> (0) - создает ли этот экземпляр the_template с type int ?

Причиной запроса является следующий код, который приведет к ошибке при связывании времени с неопределенной ссылкой на check_error (void *, long) с Clang и GCC 4.4.5, указывая, что он не создает экземпляр шаблона. MSVC и GCC 4.5.1 , однако, компилируются и связываются без проблем, что позволяет предположить, что он действительно создает экземпляр шаблона. Однако, если вы не укажете приведение, MSVC и GCC (как 4.4.5, так и 4.5.1) выдадут ошибку только на check_error (желаемое поведение), тогда как Clang выдаст ошибку при обоих вызовах. Обычно я верю Clang, когда дело касается соответствия требованиям, но мне интересно:

Какой компилятор правильный и что об этом говорится в стандарте?


#include 

template
void check_error(void*, long);

template
struct foo{
  template
  friend typename std::enable_if<
    std::is_same::value
  >::type check_error(foo*, int){}
};

template struct foo;

int main()
{
  check_error(static_cast*>(0), 0);
  check_error(static_cast*>(0), 0);
}

29
задан Xeo 6 December 2011 в 07:01
поделиться

1 ответ

Не специализация создает экземпляр специализации шаблона класса, а вызов функции, потому что аргумент запускает ADL. Инстанцирование сделано, потому что его полнота может повлиять на семантику программы.

То, что кланг не соответствует спецификации, здесь известно, и некоторое время назад я послал мне пиар. См. http://llvm.org/bugs/show_bug.cgi?id=9440

.
17
ответ дан 28 November 2019 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: