2016-06-23 26 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; 
} 

をしかし、それは、G ++と打ち鳴らす++でコンパイルに失敗します。

グラム++: error: expected type-specifier before 'constexpr'

打ち鳴らす++:私はそれを打ち鳴らすから

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

をコンパイルするために、以下のようにしなければならない error: type name does not allow constexpr specifier to be specified

++のエラーメッセージ、私がのためにconstexprを使用することができないようですタイプ名。

したがって、タイプエイリアスをconstexpr関数に定義することは可能ですか?はいの場合、どうですか?

+3

静的に使用できないように... –

+0

"*したがって、constexpr関数への型エイリアスを定義することは可能ですか?" 1つの型エイリアスを持つことができます。あたかもコンパイル時定数式であるかのように関数を呼び出すことはできません。だからあなたが望む効果は不可能です。 –

+0

@MarcGlisそれは理にかなっています。 – 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

関連する問題