定数はコンパイル時定数でなければなりません!

1936 ワード

関数パラメータ定数を2つのことにします.まず、関数を呼び出すと、関数は自己価値の価値を変えることはありません.次に、機能が自己価値の価値を変えないことを確保します.
constexpr
C++には実際には2つの異なる定数がある.ランタイム定数の初期化値は、変数usersageや自己価値以上のランタイムのみです.コンパイル時定数の初期化値は、コンパイル時(変数の重力など)に解決できます.ほとんどの場合、定数値が実行時またはコンパイル時間であっても重要ではありません.しかしながら、いくつかの奇妙な場合、C++は、実行時定数時間ではなくコンパイルする必要がある(例えば、一定サイズの配列の長さを定義するなど、後で).定数の値が実行時またはコンパイル時である可能性があるため、コンパイラはどの定数が正しいかを理解する必要があります.
これを解消するのに役立ち、C++11は定数がコンパイル時定数でなければならない新しいキーワードconstexprを導入しました.
constexpr double gravity (9.8); // ok, the value of 9.8 can be resolved at compile-time
constexpr int sum = 4 + 5; // ok, the value of 4 + 5 can be resolved at compile-time
 
std::cout << "Enter your age: ";
int age;
std::cin >> age;
constexpr int myAge = age; // not okay, age can not be resolved at compile-time

関数パラメータ定数を2つのことにします.まず、関数を呼び出すと、関数は自己価値の価値を変えることはありません.次に、機能が自己価値の価値を変えないことを確保します.
constexpr
C++には実際には2つの異なる定数がある.ランタイム定数の初期化値は、変数usersageや自己価値以上のランタイムのみです.コンパイル時定数の初期化値は、コンパイル時(変数の重力など)に解決できます.ほとんどの場合、定数値が実行時またはコンパイル時間であっても重要ではありません.しかしながら、いくつかの奇妙な場合、C++は、実行時定数時間ではなくコンパイルする必要がある(例えば、一定サイズの配列の長さを定義するなど、後で).定数の値が実行時またはコンパイル時である可能性があるため、コンパイラはどの定数が正しいかを理解する必要があります.
これを解消するのに役立ち、C++11は定数がコンパイル時定数でなければならない新しいキーワードconstexprを導入しました.
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef CONSTANTS_H
#define CONSTANTS_H
 
// define your own namespace to hold constants
namespace constants
{
    const double pi(3.14159);
    const double avogadro(6.0221413e23);
    const double my_gravity(9.2); // m/s^2 -- gravity is light on this planet
    // ... other related constants
}
#endif

コードをコンパイルするとmaxの代わりにプロセッサがstudents_per_classのすべてのインスタンスのテキスト値30は、実行可能ファイルにコンパイルされます.不思議な数字を夫婦に使うよりも直感的な理由に同意するかもしれません.max_students_per_classは、コメントがなくても、コンテキストが何なのかを提供しています.次に、最大学生の教室数が変化すれば、maxを1つの場所で変えるだけです.students_per_classの価値とmax_students_per_classのすべてのインスタンスは、次回コンパイルされる新しい文学的価値に取って代わられます.2番目の例を考慮すると、#を使用してシンボル定数を定義します.