use*_*075 12 c++ return-type language-lawyer constexpr c++14
我有这个非常简单的功能,无法编译.
constexpr void func()
{
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
error: invalid return type 'Run Code Online (Sandbox Code Playgroud)void' ofconstexprfunction 'constexpr void func()'constexpr void func()
在C++ 14中,void是一个文字类型[§3.9/ 10]:
类型是文字类型,如果它是:
- 无效; 要么
- 标量类型; 要么
- 参考类型; 要么
- 一个文字类型的数组; 要么
- 具有以下所有属性的类类型(第9节):
- 它有一个简单的析构函数,
- 它是聚合类型(8.5.1)或至少有一个
constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且- 它的所有非静态数据成员和基类都是非易失性文字类型.
有人能解释为什么这是无效的吗?
提出void字面类型的提议是n3652放宽对constexpr功能的约束.G ++决定将此功能推向第5版(我使用的是4.9.2):
G ++现在支持C++ 14扩展constexpr.
Run Code Online (Sandbox Code Playgroud)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;
}
Run Code Online (Sandbox Code Playgroud)
使用Clang的Coliru示例,符合此处.