Можно ли определить псевдоним типа для функции constexpr

В 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; Если да, то как?

8

Решение

Согласно стандарту 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 = тип ожидается.

8

Другие решения

Вы не можете определить псевдоним типа для функции constexpr.

1

По вопросам рекламы [email protected]