C++ constexpr无效函数被拒绝
我有一个非常简单的函数,它不会编译C++ constexpr无效函数被拒绝,c++,language-lawyer,c++14,return-type,constexpr,C++,Language Lawyer,C++14,Return Type,Constexpr,我有一个非常简单的函数,它不会编译 constexpr void func() { } 我得到的错误是: error: invalid return type 'void' of constexpr function 'constexpr void func()' constexpr void func() 在C++14中,void是一种文字类型[§3.9/10]: 如果类型是: 空虚;或 标量类型;或 参考类型;或 文字类型的数组;或 具有以下所有属性的类类型(第9条): 它
constexpr void func()
{
}
我得到的错误是:
error: invalid return type 'void
' of constexpr
function 'constexpr void func()
'
constexpr void func()
在C++14中,void
是一种文字类型[§3.9/10]:
如果类型是:
- 空虚;或
- 标量类型;或
- 参考类型;或
- 文字类型的数组;或
- 具有以下所有属性的类类型(第9条):
- 它有一个小的析构函数
- 它是聚合类型(8.5.1),或至少有一个
构造函数或不是复制或移动构造函数的构造函数模板,以及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
Clang从3.4版开始就实现了这一点。它确实有效,但在GCC中还不受支持。标准中的一个示例实际上包括返回
void
的constexpr
函数-请参见[dcl.constexpr]/1:
constexpr void square(int &x); // OK: declaration
// [..]
constexpr void square(int &x) { // OK: definition
x *= x;
}
使用Culon,这里符合。
< P>从C++程序语言(第四版): constexpr函数可能没有副作用 那么,constexpr void函数的用途是什么 如果您的目标是这样做:constexpr void Twice(int &a)
{
a *= 2;
}
你应该考虑改为:
constexpr int Twice(int a)
{
return 2 * a;
}
引用C++14之后的工作草案的可能重复对于证明C++14的事实不是很有用。目的?简单,例如:模板constexpr void requireIntegral(){static_assert(std::is_integral::value,“类型必须是整数”);};你说得对,说得好。从未想过以这种方式使用constexpr函数。