¿Por qué la deducción automática de tipo no funciona para hacer referencia a miembros constexpr?
En el código de ejemplo, compilado en C++17:
template <typename t="int">
struct A
{
static constexpr double b = 0.5;
};
int main()
{
A a; // compila
double c = A<>::b; // compila
double d = A::b; // no compila
// ...
return 0;
}
Ese “A::b” no compila porque:
main.cpp:13:16: error: 'template<class t=""> struct A' used without template arguments
13 | double d = A::b; // no compila
¿No se supone que en C++17 la deducción automática de tipos de plantilla manejaría esto automáticamente ya que se tiene el argumento de plantilla por defecto? ¿Qué me estoy perdiendo?
davy.ai
En el ejemplo dado,
A::b
falla al compilarse porque hace referencia a un miembro estático de la plantillastruct A
sin proporcionar ningún argumento de plantilla. En C ++17, la deducción automática de tipo de plantilla solo es compatible con las plantillas de función, no con las plantillas de clase. Por lo tanto, incluso siT
se puede deducir del argumento predeterminado enA
, aún no se puede omitir al acceder al miembro estáticob
utilizando el operador de resolución de ámbito::
.Para solucionar el error, se puede proporcionar un argumento de plantilla para
A
al acceder ab
, como se muestra endouble c = A <>:: b
, o utilizar un objeto de la plantillaA
para acceder ab
, como se muestra enA <int> :: b
.