Diferencias en la interpretación de una construcción no dependiente entre el contexto de definición y el punto de instanciación en c ++

N4527 14.6 [temp.res] / p8

Si una instancia hipotética de una plantilla inmediatamente después de su definición estaría mal formada debido a una construcción que no depende de un parámetro de plantilla, el programa está mal formado; No se requiere diagnóstico. Si la interpretación de tal construcción en la instanciación hipotética es diferente de la interpretación de la construcción correspondiente en cualquier instanciación real de la plantilla, el programa está mal formado; No se requiere diagnóstico. [Nota: Esto puede suceder en situaciones que incluyen lo siguiente:

(8.1) - un tipo usado en un nombre no dependiente está incompleto en el punto en el que se define una plantilla pero está completo en el punto en el que se realiza una instanciación, o

(8.2) -una instancia utiliza un argumento predeterminado o un argumento de plantilla predeterminado que no se había definido en el punto en el que se definió la plantillao

(8.3) - evaluación de expresión constante (5.20) dentro de los usos de creación de instancias de plantilla

(8.3.1) -El valor de un objeto constante de tipo de enumeración integral o sin ámbito o

(8.3.2) - el valor de un objeto constexpr o

(8.3.3) - el valor de una referencia o

(8.3.4) - la definición de una función constexpr,

y esa entidad no se definió cuando se definió la plantilla, o

Entonces, ¿están mal formados estos códigos?

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;

YIssue1850 Diferencias entre el contexto de definición y el punto de instanciación

Varias características de entidades a las que hace referencia una referencia no dependiente en una plantilla pueden cambiar entre el contexto de definición y el punto de instanciación de una especialización de esa plantilla. Estos incluyen la inicialización (que afecta si un objeto se puede usar en una expresión constante), los argumentos predeterminados de funciones y plantillas, y la integridad de los tipos. Existe una divergencia de implementación en cuanto a si se verifican en el contexto de definición o en el punto de instanciación. Presumiblemente, se necesita una regla para que esté mal formada, no se requiere diagnóstico, si la validez de dicha referencia cambia entre los dos contextos.

¿Me puede mostrar más ejemplos sobre cómo las características de los nombres no dependientes son diferentes entre los dos contextos? Típicamente alrededor de 8.2 y 8.3.1

Respuestas a la pregunta(1)

Su respuesta a la pregunta