Jakie są reguły, według których std::is_constructibleobsługuje się konstruktorów prywatnych? Biorąc pod uwagę następujący kod:
#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();
}
To drukuje 0( ideone ), tzn. TNie jest domyślnie możliwe do zbudowania.
Komentując komentarz, drukuje 11( ideone ), dzięki czemu Tnagle stała się domyślną konstrukcją.
Mogłem znaleźć uzasadnienie na poparcie obu wyników, ale nie rozumiem, w jaki sposób włączenie komentowanego wiersza zmienia wynik drugiego. Czy to w jakiś sposób wywołuje UB? Czy to błąd kompilatora? A może std::is_constructiblenaprawdę jest to niespójne?
::valuewersja jest w stanie zmienić wyjście także tych, którzy się przed nim pojawili : godbolt.org/z/zCy5xU Odkomentuj komentarz i wszystko staje się 1: s w gcc.
falseale jeśli szablon funkcji nie jest komentowany, nagle zwraca true: godbolt.org/z/zqxdk2
00