Quali sono le regole con cui std::is_constructible
gestisce i costruttori privati? Dato il seguente codice:
#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();
}
Questa stampa 0
( ideone ), cioè T
non è di default costruibile.
Non commentando la riga commentata, stampa 11
( ideone ), T
divenendo così improvvisamente costruibile.
Potrei trovare il ragionamento per supportare entrambi i risultati, ma non capisco come l'inclusione della riga commentata cambi il risultato del secondo. Questo in qualche modo sta invocando UB? È un bug del compilatore? O è std::is_constructible
davvero così incoerente?
::value
versione sia in grado di cambiare l'output di quelli che la precedono: godbolt.org/z/zCy5xU Uncomment la riga commentata e tutto diventa 1: s in gcc.
false
ma se il modello di funzione non è commentato, improvvisamente restituisce true
: godbolt.org/z/zqxdk2
00