c++ - 为什么 is_default_constructible<Class>::value 在同一类范围内失败

标签 c++ c++11 typetraits default-constructor static-assert

以下工作正常:

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

最佳答案

documentation pagestd::is_default_constructible<T> :

T shall be a complete type, (possibly cv-qualified) void, or an array of unknown bound. Otherwise, the behavior is undefined.

因为你在你的类(class),类型还没有完全定义,我想这就是差异的原因。


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

T obj();

well formed成员常量 value等于 true .在所有其他情况下,valuefalse .

所以我对此的理解以及我基于坦率的名称的语义直觉会说,如果默认构造函数是私有(private)的,它应该会失败。

关于c++ - 为什么 is_default_constructible<Class>::value 在同一类范围内失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41342671/

相关文章:

c++ - 将 std::chrono::system_clock::time_point 转换为 struct timeval 并返回

c++ - 从 lambda 表达式中抛出异常,坏习惯?

c++ - 测试 std::pointer_traits 是否适用于我的类型

c++ - CMake C++ 在编译时设置 header DEBUG 变量?

c++ - std::vector 连续意义

c++ - 异或链表实现

c++ - 如何将重写的虚函数的指针发送到基类?

c++ - 如果有成员,则基类中的默认析构函数禁用子类中的move构造函数

c++11 - 检测两种类型是否是同一类模板的特化?

c++:是否有类似 "boost/std typetraits conditional"的东西在编译时生成一个值(不是类型)?