Diferenças da interpretação de um construto não dependente entre o contexto da definição e o ponto de instanciação em c ++

N4527 14,6 [temp.res] / p8

Se uma instanciação hipotética de um modelo imediatamente após sua definição ficar mal formada devido a uma construção que não depende de um parâmetro do modelo, o programa está mal formado; nenhum diagnóstico é necessário. Se a interpretação de tal construto na instanciação hipotética for diferente da interpretação do construto correspondente em qualquer instanciação real do modelo, o programa está mal formado; nenhum diagnóstico é necessário. [Nota: isso pode acontecer em situações como as seguintes:

(8.1) - um tipo usado em um nome não dependente está incompleto no ponto em que um modelo é definido, mas está completo no ponto em que uma instanciação é executada, ou

(8,2) -uma instanciação usa um argumento padrão ou um argumento de modelo padrão que não havia sido definido no ponto em que o modelo foi definidoou

(8.3) - avaliação de expressão constante (5.20) dentro do modelo de instanciação

(8.3.1) -o valor de um objeto const do tipo de enumeração integral ou sem escopo ou

(8.3.2) - o valor de um objeto constexpr ou

(8.3.3) - o valor de uma referência ou

(8.3.4) - a definição de uma função constexpr,

e essa entidade não foi definida quando o modelo foi definido, ou

Então, esses códigos estão mal formados?

código 1:

extern double b;

template<class T>
void f(T=b){}

void g(){
    f<double>();//ill-formed or not?
}

double b = 0;

void h(){
    f<double>();//ill-formed or not?
}

código 2:

//translation 1
extern double b;

template<class T>
void f(T=b){}

void g(){
    f<double>();//ill-formed or not?
}

//translation 2
double b = 0;

EEdição1850 Diferenças entre o contexto da definição e o ponto de instanciação

Várias características de entidades referidas por uma referência não dependente em um modelo podem mudar entre o contexto de definição e o ponto de instanciação de uma especialização desse modelo. Isso inclui inicialização (que afeta se um objeto pode ser usado em uma expressão constante), argumentos padrão de função e modelo e a integridade dos tipos. Há divergências de implementação quanto à verificação no contexto de definição ou no momento da instanciação. Presumivelmente, é necessária uma regra para torná-la mal formada, sem necessidade de diagnóstico, se a validade dessa referência mudar entre os dois contextos.

Você pode me mostrar mais exemplos sobre como as características de nomes não dependentes são diferentes entre os dois contextos? Geralmente sobre 8.2 e 8.3.1

questionAnswers(1)

yourAnswerToTheQuestion