static_cast<the_template<int>*>(0)
- создает ли этот экземпляр the_template
с типом int
?
Причиной для запроса является следующий код, который приведет к ошибке при связывании времени с ссылкой undefined на check_error<char>(void*, long)
с помощью Clang и GCC 4.4.5, что указывает на то, что он не создает экземпляр шаблона. MSVC и GCC 4.5.1, однако компилировать и связывать просто отлично, что приводит к тому, что он создает экземпляр шаблона. Однако, если вы не учитываете листинг, MSVC и GCC (как 4.4.5, так и 4.5.1) будут ошибочными только в check_error<char>
(желаемое поведение), в то время как Clang будет ошибкой при обоих вызовах. Обычно я верю Клану, когда дело доходит до подходящего материала, но мне интересно:
Какой компилятор прав и что говорит об этом стандарт?
#include <type_traits>
template<class T>
void check_error(void*, long);
template<class T>
struct foo{
template<class U>
friend typename std::enable_if<
std::is_same<T,U>::value
>::type check_error(foo<T>*, int){}
};
template struct foo<int>;
int main()
{
check_error<int>(static_cast<foo<int>*>(0), 0);
check_error<char>(static_cast<foo<char>*>(0), 0);
}