问题 constexpr void函数被拒绝


我有这个非常简单的功能,无法编译。

constexpr void func()
{
}

我得到的错误是:

错误:无效的返回类型'void'的 constexpr 功能'constexpr void func()“

      constexpr void func()

在C ++ 14中, void 是文字类型[§3.9/ 10]:

一种类型是 字面类型 如果是:

  • 无效;要么
  • 标量类型;要么
  • 参考类型;要么
  • 一个文字类型的数组;要么
  • 具有以下所有属性的类类型(第9节):   
    • 它有一个简单的析构函数,
    • 它是聚合类型(8.5.1)或至少有一个 constexpr 构造函数或构造函数模板,它不是复制或移动构造函数,以及
    • 它的所有非静态数据成员和基类都是非易失性文字类型。

有人可以解释为什么这是无效的吗?


4853
2018-03-25 16:31


起源

可能重复 Void是一个字面类型? - Zan Lynx
引用C ++ 14后的工作草案对于证明C ++ 14的事实并不是很有用。 - Lightness Races in Orbit


答案:


提出的提案 void 文字类型是 n3652放松约束 constexpr 功能。 G ++决定将此功能推向版本  (我使用的是4.9.2):

G ++现在支持C ++ 14扩展constexpr。

constexpr int f (int i)
{
  int j = 0;
  for (; i > 0; --i)
    ++j;
  return j;
}

constexpr int i = f(42); // i is 42

自版本3.4以来,Clang已经实现了这一功能。


7
2018-03-25 16:38





它确实有效,但在海湾合作委员会尚未得到支持。标准中的一个例子实际上包括 constexpr 函数返回 void  - 见[dcl.constexpr] / 1:

constexpr void square(int &x); // OK: declaration
 // [..]
constexpr void square(int &x) { // OK: definition
    x *= x;
}

关于Coliru的例子 使用Clang,这符合这里。


6
2018-03-25 16:38





取自 C ++ Programmig语言(第4版)

constexpr功能可能没有副作用。

那么,constexpr void函数的目的是什么?

如果你的目标是这样做:

constexpr void Twice(int &a)
{
    a *= 2;
}

你应该考虑改为:

constexpr int Twice(int a)
{
    return 2 * a;
}

2
2018-03-25 17:21



目的?容易,例如:template <typename T> constexpr void requireIntegral(){static_assert(std :: is_integral <T> :: value,“type must is integral”); }; - Arne Vogel
你说得对,好点。从未想过以这种方式使用constexpr功能。 - static_cats