Quelles sont les règles de std::is_constructible
gestion 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, T
n'est pas constructible par défaut.
Décommentant la ligne commentée, elle s'affiche11
( ideone ), si T
soudainement 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_constructible
vraiment incohérent?
::value
version 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.
false
mais si le modèle de fonction n'est pas commenté, il retourne soudainement true
: godbolt.org/z/zqxdk2
00