¿Cuáles son las reglas por las cuales se std::is_constructiblemanejan 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, Tno es construible por defecto.
Descomentando la línea comentada, imprime 11( ideone ), por lo que de Trepente 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_constructiblerealmente tan inconsistente?
::valueversió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.
falsepero si la plantilla de función no está comentada, de repente regresa true: godbolt.org/z/zqxdk2
00