static_cast
- создает ли этот экземпляр the_template
с type int
?
Причиной запроса является следующий код, который приведет к ошибке при связывании времени с неопределенной ссылкой на check_error
с 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);
}
Не специализация создает экземпляр специализации шаблона класса, а вызов функции, потому что аргумент запускает ADL. Инстанцирование сделано, потому что его полнота может повлиять на семантику программы.
То, что кланг не соответствует спецификации, здесь известно, и некоторое время назад я послал мне пиар. См. http://llvm.org/bugs/show_bug.cgi?id=9440
.