constexpr は、C++11 での有用性が制限されているように感じます。これは、そうでなければ同じシグネチャを持つが、1 つが constexpr で、もう 1 つが constexpr でない 2 つの関数を定義できないためです。つまり、たとえば、constexpr 引数のみを取る constexpr std::string コンストラクターと、非 constexpr 引数用の非 constexpr std::string コンストラクターがあれば非常に便利です。もう 1 つの例は、state を使用してより効率的にすることができる、理論的に複雑な関数です。これを constexpr 関数で簡単に行うことはできないため、次の 2 つの選択肢があります。constexpr 以外の引数を渡すと非常に遅い constexpr 関数を使用するか、constexpr を完全に放棄するか (または 2 つの別個の関数を記述し、ただし、どのバージョンを呼び出すべきかわからない場合があります)。
したがって、私の質問は次のとおりです。
標準準拠の C++11 実装で、引数が constexpr であることに基づいて関数のオーバーロードを許可することは可能ですか?それとも標準を更新する必要がありますか? 許可されていない場合、意図的に許可されていませんでしたか?
@NicolBolas: を にマップする関数があるとしenum
ますstd::string
。これを行う最も簡単な方法は、 myenum
が から0
に進むと仮定して、結果で満たされたn - 1
サイズの配列を作成することです。n
を作成して戻り時にstatic constexpr char const * []
構築する(関数を呼び出すたびにオブジェクトを作成するコストを支払う) ことも、 を作成して検索した値を返すこともできます。関数を呼び出します。より良い解決策は、コンパイル時にメモリ内に を作成することだと思われますが (現在 で行われているのと同様)、これを行う唯一の方法は、コンストラクタに引数があることを警告することです。std::string
std::string
static std::string const []
std::string
std::string
char const *
constexpr
コンストラクター以外の例については、要件を無視できる(したがって非関数を作成する) ことができれば、より効率的な関数を作成std::string
できる例を見つけるのは非常に簡単だと思います。次のスレッドを考えてみてください: constexpr の質問、なぜこれら 2 つの異なるプログラムが g++ でこれほど異なる時間で実行されるのですか?constexpr
constexpr
引数を指定して呼び出した場合、関数呼び出しを完全に最適化するコンパイラよりも優れた結果fib
を出すconstexpr
ことはできません。しかし、引数なしで呼び出す場合はfib
、メモ化 (状態が必要) などを実装する独自のバージョンを呼び出して、引数constexpr
を渡した場合のコンパイル時間と同様の実行時間を取得したい場合があります。 constexpr
.