Quelles sont les règles de std::is_constructiblegestion des constructeurs privés? Étant donné le code suivant:
#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();
}
Cette affiche0 ( ideone ), c'est à dire, Tn'est pas constructible par défaut.
Décommentant la ligne commentée, elle s'affiche11 ( ideone ), si Tsoudainement devenue par défaut constructible.
Je pourrais trouver un raisonnement pour soutenir les deux résultats, mais je ne comprends pas comment l'inclusion de la ligne commentée modifie le résultat de la seconde. Est-ce que cela appelle en quelque sorte UB? S'agit-il d'un bug du compilateur? Ou est-ce std::is_constructiblevraiment incohérent?
::valueversion soit capable de changer la sortie de ceux qui la précèdent aussi: godbolt.org/z/zCy5xU Décommentez la ligne commentée et tout devient 1: s dans gcc.
falsemais si le modèle de fonction n'est pas commenté, il retourne soudainement true: godbolt.org/z/zqxdk2
00