У меня возникла проблема с переносом некоторого кода в MSVC, что меня озадачило. Насколько мне известно, код должен быть законным, а Clang просто компилирует его.
Я сузил его до следующего:
enum E {
x
};
template <typename T>
struct traits {
static const E val = x;
};
template <E e>
struct S {
S(){};
};
template <typename T>
S<traits<T>::val> foo(T t);
int main() {
char c = 0;
foo(c);
}
Обратите внимание, что после компиляции ожидается, что код даст ошибку компоновщика (я удалил определение функции foo
, чтобы сохранить образец минимальным), но он должен скомпилировать, насколько я знаю,
Однако MSVC дает мне эту ошибку:
ошибка C2893: не удалось специализировать шаблон функции "S:: val > foo (T)"
Итак, мой вопрос:
- является MSVC, если он ошибочно отвергает код? (и если да, то почему?)
- Если нет, может ли кто-нибудь сузить то, что он делает неправильно? Как и в случае, это языковая функция, которую они вообще не реализуют (например, поиск двухфазных имен для шаблонов) или "просто" простая ошибка при реализации функции, которую они утверждают, что она поддерживает?
Я воспроизвел проблему на VС++ 2010 и 2012.