Рассмотрим простой код С++ 11:
template<int N>
struct Foo {};
template <int N>
constexpr int size(const Foo<N>&) { return N; }
template <int N>
void use_size(const Foo<N>& foo) { constexpr int n = size(foo); }
int main()
{
Foo<5> foo;
constexpr int x = size(foo); // works with gcc and clang
// _but_
use_size(foo); // the same statement in the use_size()
// function _only_ works for gcc
}
Я могу с успехом скомпилировать его с помощью g++ -std=c++11 foo.cpp
однако, если я использую clang++, clang++ -std=c++11 foo.cpp
, я получаю
foo.cpp:15:28: error: constexpr variable 'n' must be initialized by a constant expression
void use_size(const Foo<N>& foo) { constexpr int n = size(foo); }
~~~~~^~~~
foo.cpp:23:5: note: in instantiation of function template specialization 'use_size<5>' requested here
use_size(foo); // the same statement in the use_size()
^
1 error generated.
(nb: версии компилятора. Я проверил предыдущий оператор с версией g++ версии 5.3.1 и 7.2.1 и с clang++ версии 3.6.2 и 5.0.0)
Мой вопрос:, который из g++ или clang прав? В чем проблема?