Учитывая следующий код:
#include <iostream>
template <std::size_t N>
struct foo
{ static std::size_t value; };
template <>
std::size_t foo<0>::value = 0u;
template <size_t N>
std::size_t foo<N>::value = 1u + foo<N - 1u>::value;
int main()
{
std::cout
<< foo<3u>::value << ' '
<< foo<2u>::value << ' '
<< foo<1u>::value << ' '
<< foo<0u>::value << std::endl;
}
где статический член value
из шаблона структуры foo
рекурсивно инициализирован, я получаю различные выходы из g++:
3 2 1 0
и из клана g++:
1 1 1 0
Поэтому кажется, что g++ рекурсивно инициализирует foo<N>::value
используя инициализированное значение foo<N-1u>::value
где клан g++ использует ноль для foo<N-1u>::value
.
Два вопроса:
- законен ли предыдущий код или это неопределенное поведение в некотором роде?
- если предыдущий код является законным, кто прав: g++ или клан g++?