我有这个非常简单的功能,无法编译。
constexpr void func()
{
}
我得到的错误是:
error: invalid return type 'void
' ofconstexpr
function 'constexpr void func()
'constexpr void func()
在C ++ 14中,void
是一个文字类型[§3.9/ 10]:
类型是文字类型,如果它是:
- 空隙;或
- 标量类型;或
- 参考类型;或
- 一个文字类型的数组;或
- 具有以下所有属性的类类型(第9条):
- 它有一个简单的析构函数,
- 它是聚合类型(8.5.1)或至少有一个
constexpr
构造函数或构造函数模板,它不是复制或移动构造函数,并且- 它的所有非静态数据成员和基类都是非易失性文字类型。
有人可以解释为什么这是无效的吗?
答案 0 :(得分:7)
使void
为文字类型的提案为n3652 Relaxing constraints on constexpr
functions。 G ++决定将此功能推送到版本5(我使用的是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
Clang从版本3.4开始实现。
答案 1 :(得分:6)
确实有效,但GCC尚未支持。标准中的示例实际上包括返回constexpr
的{{1}}函数 - 请参阅[dcl.constexpr] / 1:
void
Example on Coliru使用Clang,符合此处。
答案 2 :(得分:2)
取自 C ++ Programmig语言(第4版):
constexpr功能可能没有副作用。
那么,constexpr void函数的目的是什么?
如果你打算做那样的事情:
constexpr void Twice(int &a)
{
a *= 2;
}
您应该考虑更改为:
constexpr int Twice(int a)
{
return 2 * a;
}