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