В 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; Если да, то как?
Согласно стандарту C ++ 7.1.5 / p8 constexpr
спецификатор [dcl.constexpr] (Акцент на шахте):
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 =
тип ожидается.
Вы не можете определить псевдоним типа для функции constexpr.