Nach welchen Regeln werden std::is_constructible
private Konstruktoren behandelt? Gegeben den folgenden Code:
#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();
}
Dieser Druck 0
( ideone ) ist also T
nicht standardmäßig konstruierbar.
Ohne die kommentierte Zeile zu kommentieren, wird sie gedruckt 11
( ideone ), so dass sie plötzlichT
standardmäßig konstruierbar wurde.
Ich konnte Gründe finden, um beide Ergebnisse zu unterstützen, aber ich verstehe nicht, wie das Einfügen der kommentierten Zeile das Ergebnis der zweiten ändert. Ruft das irgendwie UB auf? Ist das ein Compiler-Fehler? Oder ist das std::is_constructible
wirklich inkonsistent?
::value
Version in der Lage ist, die Ausgabe derjenigen zu ändern, die davor stehen: godbolt.org/z/zCy5xU Kommentieren Sie die kommentierte Zeile aus und alles wird 1: s in gcc.
false
aber wenn die Funktionsvorlage nicht kommentiert ist, wird plötzlich Folgendes zurückgegebentrue
: godbolt.org/z/zqxdk2
00