2016-06-23 14 views
6

W C++ 11 lub C++ 14, próbuję zdefiniować alias typu do funkcji constexpr.Czy można zdefiniować alias typu do funkcji constexpr

Próbowałem:

#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; 
} 

Ale to nie skompilować z g ++ i Clang ++.

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

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

mam zrobić jak poniżej, aby skompilować

#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; 
} 

Z brzękiem ++ 's komunikatem o błędzie, wydaje się nie mogę za pomocą constexpr dla Wpisz imię.

Czy istnieje możliwość zdefiniowania aliasu typu do funkcji constexpr; Jeśli tak, w jaki sposób?

+3

Tak jak nie możesz użyć słowa "static" ... –

+0

"* Czy możliwe jest zdefiniowanie aliasu typu do funkcji constexpr *" Możesz mieć alias typu dla jednego. Po prostu nie można wywołać funkcji, jak gdyby była to ciągła ekspresja czasu kompilacji za pośrednictwem jednego. Efekt, który prawdopodobnie chcesz, jest niemożliwy. –

+0

@MarcGlisse ma sens. – Mine

Odpowiedz

7

Według C++ standardowej 7.1.5/P8 constexpr specyfikator [dcl.constexpr] (podkr)

constexpr specyfikator ma wpływ na rodzaj z constexpr funkcja lub konstruktor constexpr.

Również z 7 deklaracji [dcl.dcl]:

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

constexpr specyfikator nie jest częścią typu A funkcji. W konsekwencji, nie można zrobić:

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

Ponieważ po using TConstExprFunction = oczekiwany jest typ.

1

Nie można zdefiniować aliasu typu do funkcji constexpr.

+0

Czy istnieje jakiś szczególny powód, dla którego standard C++ go nie obsługuje? – Mine

Powiązane problemy