Рассмотрим следующий код:
template <int* > struct foo { };
int main() {
foo<(int*)42> f;
(void)f;
}
При компиляции на clang 3.8.0 с -std=c++11
или -std=c++14
программа компилируется. При компиляции с -std=c++1z
, это ошибки с:
main.cpp:4:9: error: non-type template argument is not a constant expression
foo<(int*)42> f;
^~~~~~~~
gcc 5.3.0 не компилирует код независимо от режима С++, который, как я считаю, является правильным. В чем разница между clang между С++ 14 и С++ 1z и почему он принимает код? Что-то изменилось в С++ 1z, которое здесь имеет значение?