是否可以为constexpr函数定义类型别名

时间:2016-06-23 13:55:50

标签: c++ c++11 constexpr type-alias

在C ++ 11或C ++ 14中,我试图为constexpr函数定义一个类型别名。

我试过了:

#include <iostream>
constexpr int foo(int i, int j) { return i + j; }
using TConstExprFunction  = constexpr int (*)(int i, int j);

int main() {
  TConstExprFunction f = foo;
  constexpr int i = f(1, 2);
  std::cout << i << std::endl;
}

但它无法使用g ++和clang ++进行编译。

克++: error: expected type-specifier before 'constexpr'

铛++: error: type name does not allow constexpr specifier to be specified

我必须按照以下方式进行编译

#include <iostream>
constexpr int foo(int i, int j) { return i + j; }
using TConstExprFunction  = int (*)(int i, int j);

int main() {
  constexpr TConstExprFunction f = foo;
  constexpr int i = f(1, 2);
  std::cout << i << std::endl;
}

从clang ++的错误消息来看,我似乎无法使用constexpr作为类型名称。

那么,是否可以为constexpr函数定义类型别名;如果是,怎么样?

2 个答案:

答案 0 :(得分:8)

根据C ++标准 7.1.5 / p8 constexpr说明符[dcl.constexpr] Emphasis Mine ):

  

constexpr说明符对constexpr的类型没有影响   函数constexpr构造函数。

同样来自 7声明[dcl.dcl]

alias-declaration:
using identifier attribute-specifier-seqopt = defining-type-id ;

constexpr说明符不是函数类型的一部分。因此,你不能这样做:

using TConstExprFunction  = constexpr int (*)(int i, int j);

因为预期using TConstExprFunction =类型之后。

答案 1 :(得分:1)

您无法为constexpr函数定义类型别名。