Especialização de membro de classe de modelo sem declaração no cabeçalho

Eu tenho uma classe de modelo que declaro em um cabeçalho com um método e nenhuma definição desse método no cabeçalho. Em um arquivo .cc, eu defino as especializações desse métodosem nunca declará-los no cabeçalho. Em um arquivo .cc diferente, chamo o método para diferentes parâmetros de modelo para os quais existem especializações. Se parece com isso:

foo.h:

template<typename T>
class Foo {
public:
  static int bar();
};

foo.cc:

#include "foo.h"

template<>
int Foo<int>::bar() {
  return 1;
}

template<>
int Foo<double>::bar() {
  return 2;
}

main.cc:

#include <iostream>
#include "foo.h"

int main(int argc, char **argv) {
  std::cout << Foo<int>::bar() << std::endl;
  std::cout << Foo<double>::bar() << std::endl;
  return 0;
}

Este programa compila e liga com sucesso com o gcc 4.7.2 para todos os padrões C ++ (c ++ 98, gnu ++ 98, c ++ 11 e gnu ++ 11). A saída é:

1
2

Isso faz sentido para mim. Porque a unidade de tradução main.cc não vê uma definição debar() ou qualquer especialização do mesmo, espera que as chamadas parabar() para usar instanciações explícitas de uma definição não especializada debar() em alguma outra unidade de tradução. Mas como o nome mangling é previsível, as especializações em foo.cc têm os mesmos nomes de símbolos que instanciações explícitas de uma definição não especializada, portanto main.cc é capaz de usar essas especializações sem que elas sejam declaradas naquela unidade de tradução.

Minha pergunta é: isso é um acidente ou esse comportamento é determinado pelo padrão C ++? Em outras palavras, este código é portátil?

A questão anterior mais relevante que pude encontrar éDeclaração de especialização de membro de classe de modelo, mas não cobre este caso em particular.

(Caso você esteja se perguntando por que isso é importante para mim, é porque estou usando código como este como uma espécie de tabela de consulta em tempo de compilação e é muito mais curto se eu não declarar as especializações.)

questionAnswers(1)

yourAnswerToTheQuestion