C ++在实例化模板实例化时不考虑访问控制,除非需要在需要时产生错误。您正在使用的编译器仍使用这些规则。因此,您的班级不被视为不默认结构。相反,检查本身是不可能的。
GCC 4.8及更高的确实支持了这一点。一个以4.8成功的简单演示程序,并且以4.7失败为:
#include <type_traits>
class S { S() {} };
int main() {
return std::is_default_constructible<S>::value;
}
在4.8中,这将返回0。在4.7中,这会产生编译时间误差。
要解决此问题,请确保您没有默认的构造函数,甚至没有私人构造函数。您可以向构造函数添加虚拟论点,并确保始终通过该虚拟论点。