2016-06-23 8 views
6

В C++ 11 или C++ 14 я пытаюсь определить псевдоним типа для функции constexpr.Можно ли определить псевдоним типа для функции 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; 
} 

Но он не компилировать с г ++ и лязг ++.

г ++: 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; 
} 

От лязга ++ сообщение об ошибке 's, кажется, я не могу с помощью constexpr для имя типа.

Итак, можно ли определить псевдоним типа для функции constexpr; Если да, то как?

+3

Так же, как вы не можете использовать 'static' там ... –

+0

" * Таким образом, можно определить псевдоним типа для функции constexpr * «У вас может быть псевдоним типа для одного. Вы просто не можете вызвать функцию, как если бы это было выражение постоянной времени компиляции через одно. Таким образом, эффект, который вы, вероятно, хотите, невозможно. –

+0

@MarcGlisse имеет смысл. – Mine

ответ

7

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

1

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

+0

Есть ли какая-то конкретная причина, почему стандарт C++ не поддерживает это? – Mine