いいえ。 質問の例ではどちらも実行時に呼び出されます。
constexpr
が呼出されるのが実行時かコンパイル時かを決定づけるのは引数ではなく「その関数の結果を受け取る側」です。 定数式が要求されている場に現れるときにコンパイル時に呼び出されることになっています。
ただし、そのような言語上の理屈とは別に最適化による定数畳み込みがかかって定数になることはあります。
定数式が要求される文脈として代表的なものは
constexpr
指定が付いた変数の初期化
- 配列を宣言するときの要素数
- テンプレート引数に渡す値
があります。
変数に constexpr
を付けるのが定数式の文脈のコントロールとして最もわかりやすいと思うのでそれを元に例を示します。
cpp
1#include <iostream>
2
3constexpr int num(int a, int b) {
4 return a + b;
5}
6
7int main(void) {
8 int x = num(1, 5); // ← このとき num は実行時に呼び出される
9 constexpr int y = num(1, 5); // ← このとき num はコンパイル時に呼ばれる
10 constexpr int z = num(x, x); // ← このとき num はコンパイル時に呼ばれるが x は定数式ではないのでエラー
11
12 std::cout << x << y << z << std::endl;
13}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/19 12:35 編集
2020/10/19 13:06
2020/10/19 13:56
2020/10/19 14:05