Jakie są reguły, według których std::is_constructible
obsł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. T
Nie jest domyślnie możliwe do zbudowania.
Komentując komentarz, drukuje 11
( ideone ), dzięki czemu T
nagle 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_constructible
naprawdę jest to niespójne?
::value
wersja 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.
false
ale jeśli szablon funkcji nie jest komentowany, nagle zwraca true
: godbolt.org/z/zqxdk2
00