std::is_constructibleがプライベートコンストラクターを処理するルールは何ですか?次のコードがあるとします:
#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();
}
これは0(ideone)を出力しTます。つまり、デフォルトでは構築できません。
コメント行のコメントを外すと、出力されます11(ideone)。そのため、突然Tデフォルトで構築可能になりました。
私は両方の結果をサポートする理由を見つけることができましたが、コメント行を含めると2番目の結果がどのように変わるかわかりません。これはどういうわけかUBを呼び出していますか?これはコンパイラのバグですか?それともstd::is_constructible本当に矛盾していますか?
::valueバージョンはそれより前に来るものの出力を変更することができるようです:godbolt.org/z/zCy5xUコメントされた行のコメントを外すと、すべてgccで1:sになります。
falseが、関数テンプレートのコメントが解除されていると、突然戻りますtrue:godbolt.org/z/zqxdk2
00