¿Cuáles son las reglas por las cuales se std::is_constructible
manejan los constructores privados? Dado el siguiente código:
#include <iostream>
class Class {
private:
Class() { }
};
template <typename T>
class Test {
public:
static void test() {
std::cout
//<< std::is_constructible<Class>::value
<< std::is_constructible<T>::value
<< std::endl;
}
};
int main() {
Test<Class>::test();
}
Esto imprime 0
( ideone ), es decir, T
no es construible por defecto.
Descomentando la línea comentada, imprime 11
( ideone ), por lo que de T
repente se convirtió en construible por defecto.
Podría encontrar un razonamiento para respaldar ambos resultados, pero no entiendo cómo incluir la línea comentada cambia el resultado del segundo. ¿Esto de alguna manera invoca a UB? ¿Es esto un error del compilador? ¿O es std::is_constructible
realmente tan inconsistente?
::value
versión también es capaz de cambiar la salida de los que vienen antes: godbolt.org/z/zCy5xU Descomente la línea comentada y todo se convierte en 1: s en gcc.
false
pero si la plantilla de función no está comentada, de repente regresa true
: godbolt.org/z/zqxdk2
00