2016-12-27 58 views
7

以下工作正常:为什么is_default_constructible <Class> ::值相同的类范围内的失败

struct X { }; // OK 
static_assert(std::is_default_constructible<X>::value, "Error"); 

继断言失败编译:

struct X { static_assert(std::is_default_constructible<X>::value, "Error"); }; // Fails 

为什么在类中的static_assert失败?


端QN:是std::is_default_constructible应该失败与private构造函数的类的讨论:
std::is_default_constructible<T> error, if constructor is private

回答

11

documentation page说,对于std::is_default_constructible<T>

牛逼应一个完整的类型,(可能是cv-qualified)void或一个未知边界数组。否则,行为是不确定的。

由于您是在您的班级内,类型尚未完全定义,我想这就是差异的原因。


至于侧的问题,这个特性似乎是基于std::is_constructible这似乎意味着,如果变量定义

T obj(); 

well formed构件恒定value等于true。在所有其他情况下,valuefalse

所以我对这个和我坦率的基于语义的本能的理解会说如果默认的构造函数是私有的,它会失败。

+0

这种情况的解决方法是在该类的某个成员方法中包含此'static_assert'。标准还有没有参考?顺便说一下,*“未知界限数组”的含义是什么? - 为了完整起见,您也可以对“Side Qn”做出回应。 – iammilind

+0

@iammilind更新了侧面问题的答案,还有一个未知边界的数组是当你不在括号内输入数字时 - >'char array [];'。大多数情况下,cppreference引用/重写了标准,但是,您应该始终检查原始来源的安全性,但现在我没有可访问的副本。 – Drax

相关问题