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
突然变为默认可构造的。
我可以找到支持这两个结果的理由,但是我不明白包括注释行如何改变第二个结果。这是以某种方式调用UB的吗?这是编译器错误吗?还是std::is_constructible
真的不一致?
在使用c ++ 17 g ++ 9.2.1 / g ++-10.0在我的机器上编译并将std :: is_constructible <...> :: value替换为is_constructible_v <...>时,我注意到另一个奇怪的想法是结果更改为00
—
mutableVoid
@mutableVoid确实-似乎该
—
Ted
::value
版本也能够更改之前版本的输出:godbolt.org/z/zCy5xU取消注释行,在gcc中所有注释均变为1:s。
修复它的另一种方法:godbolt.org/z/EKaP3r因此,基本上,这是某种评估命令错误。
—
Marek R
—
Ted
00