7

Can C++11 compilers (and do they) notice that a function is a constexpr and treat them as such even if they are not declared to be constexpr?

I was demonstrating the use of constexpr to someone using the example straight from the Wikipedia:

int get_five() {return 5;}

int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed C++

To my surprise the compiler was OK with it. So, I further changed get_five( ) to take a few int parameters, multiply them and return the result while still not being explicitly declared to be constexpr. The compiler was OK with that as well. It seems that if the compiler can do this there isn't much point to having the restrictions that are required in order to explicitly declare something constexpr.

4

2 に答える 2

7

適切に機能する C++11 コンパイラでは、コードは拒否されます。

受け入れられていることに基づいて、ほぼ確実に gcc (またはそのバグを厳密にエミュレートするもの) を使用しています。gcc [多少フラグに依存する] は、C++ で C99 可変長配列の類似物をサポートするため、一定ではない配列サイズ (たとえば、ユーザーからの実行時の入力に依存する) を受け入れることができます。

于 2013-04-01T19:03:49.727 に答える
1

コンパイラは、最適化の目的 (つまり、コンパイル時に関数の結果を計算する) のために、関数が宣言されていない場合でも、関数が宣言されているかどうかを検出できますコンパイラは、C++11 より前にそれを行いました。constexpr

ただし、整数型のテンプレート パラメーターなど、定数式が必要な場所で使用する場合、constexprキーワードで宣言されていない関数の呼び出しを許可することは標準に反します。

于 2013-04-01T19:11:23.943 に答える