首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无效作为文字类型?

问无效作为文字类型?
EN

Stack Overflow用户
提问于 2014-12-15 14:44:47
回答 1查看 1.1K关注 0票数 14

在C++14中,void是一个文字类型。

如果类型是文字类型,那么它就是文字类型: -无效;或 -标量类型;或 -参考类型;或 -文字类型数组;或 -具有以下所有属性的类类型(第9条):-它有一个平凡的析构函数, -它是一个聚合类型(8.5.1),或者至少有一个constexpr构造函数或构造函数模板,而不是复制或移动构造函数,以及 -它的所有非静态数据成员和基类都是非易失文字类型.

在C++11中,void不是文字类型。

如果类型是文字类型,那么它就是文字类型: -标量类型;或 -指文字类型的参考类型;或 -文字类型数组;或 -具有以下所有属性的类类型(第9条):-它有一个平凡的析构函数, -非静态数据成员(如果有的话)的大括号或相等初始化器中的每个构造函数调用和完整表达式都是一个常量表达式(5.19), -它是一个聚合类型(8.5.1),或者至少有一个constexpr构造函数或构造函数模板,而不是复制或移动构造函数,以及 -它的所有非静态数据成员和基类都是文字类型。

那么,为什么void是一个文字类型呢?它有什么好处?

EN

回答 1

Stack Overflow用户

发布于 2014-12-15 14:48:24

由于void是literal type,所以constexpr函数可以在C++14中具有返回类型void。

这个提议涵盖了这一点。

引用提案:

允许一个任意表达式-语句,以便允许调用执行检查的函数,并允许类似断言的构造。void也成为文字类型,因此仅为执行此类检查而存在的constexpr函数可能返回void.。

代码语言:javascript
复制
#define ASSERT(expr) \
  (void)((expr) || assert_failed(#expr, __LINE__, __FILE__))
void assert_failed(...); // not constexpr
struct S {
  std::array a<int, 100>;
  size_t i;

  constexpr void check_invariants() const {
    ASSERT(i < a.size());
    ASSERT(a[i] == 0);
  }
  S(std::array<int, 100> a_, size_t i_) : a(a_), i(i_) {
    check_invariants();
  }
};
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27486581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档