我有这个非常简单的功能,无法编译。
constexpr void func()
{
}
我得到的错误是:
错误:无效的返回类型'void
'的 constexpr
功能'constexpr void func()
“
constexpr void func()
在C ++ 14中, void
是文字类型[§3.9/ 10]:
一种类型是 字面类型 如果是:
- 无效;要么
- 标量类型;要么
- 参考类型;要么
- 一个文字类型的数组;要么
- 具有以下所有属性的类类型(第9节):
- 它有一个简单的析构函数,
- 它是聚合类型(8.5.1)或至少有一个
constexpr
构造函数或构造函数模板,它不是复制或移动构造函数,以及
- 它的所有非静态数据成员和基类都是非易失性文字类型。
有人可以解释为什么这是无效的吗?
提出的提案 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已经实现了这一功能。
它确实有效,但在海湾合作委员会尚未得到支持。标准中的一个例子实际上包括 constexpr
函数返回 void
- 见[dcl.constexpr] / 1:
constexpr void square(int &x); // OK: declaration
// [..]
constexpr void square(int &x) { // OK: definition
x *= x;
}
关于Coliru的例子 使用Clang,这符合这里。
取自 C ++ Programmig语言(第4版):
constexpr功能可能没有副作用。
那么,constexpr void函数的目的是什么?
如果你的目标是这样做:
constexpr void Twice(int &a)
{
a *= 2;
}
你应该考虑改为:
constexpr int Twice(int a)
{
return 2 * a;
}