Aviso de tinido sobre constexpr com modelo estático (a função embutida não está definida)
Eu tenho o seguinte código c ++:
#include <array>
#include <iostream>
typedef unsigned char uchar;
class A {
public:
template <size_t N, uchar value>
static inline constexpr std::array<uchar, N> filledArray() {
std::array<uchar,N> ret{};
ret.fill(value);
return ret;
}
std::array<uchar, 5> upper = A::filledArray<5, 'A'>();
};
int main() {
A blah;
for (int i = 0; i < 5; ++i)
std::cout << blah.upper[i] << std::endl;
return 0;
}
O g ++ o compila sem avisos e a saída é As, conforme o esperado. mas clang ++ - 4.0 produz:
clang++-4.0 -std=c++14 main.cpp -o clangOut
main.cpp:9:47: warning: inline function 'A::filledArray<5, 'A'>' is not defined [-Wundefined-inline]
static inline constexpr std::array<uchar, N> filledArray() {
^
main.cpp:15:34: note: used here
std::array<uchar, 5> upper = A::filledArray<5, 'A'>();
^
1 warning generated.
/tmp/main-b6fac8.o: In function `A::A()':
main.cpp:(.text._ZN1AC2Ev[_ZN1AC2Ev]+0x15): undefined reference to `std::array<unsigned char, 5ul> A::filledArray<5ul, (unsigned char)65>()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Parece que clang é não vê, que eu instanciar a função filledArray. se eu chamar preenchidoArray com os argumentos de modelo apropriados na função principal ou em qualquer outra função, o aviso desaparecerá e o clangOut também será impresso conforme o esperado.
estou fazendo algo estúpido aqui?é a versão do gcc fazendo o que eu acho (inicialize com As no momento da compilação)?isso é um bug no clang?