在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函数定义类型别名;如果是,怎么样?
答案 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函数定义类型别名。