static_cast<the_template<int>*>(0)
- это создает экземпляр the_template
с типом int
?
Причиной запроса является следующий код, который выдает ошибку при связывании времени с неопределенной ссылкой на 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 будет давать ошибку на обоих вызовах. Обычно я верю 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);
}