タグ付けされた質問 「constexpr」

constexprはC ++ 11で導入された修飾子で、関数または変数の値が既知であるか、コンパイル時に計算できることをコンパイラーに通知します。そのため、他の方法では不可能な場所で定数として使用できます。

1
__func__ポインターの2つのconstexprインスタンスの違いはまだconstexprですか?
これは有効なC ++ですか? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCCとMSVCは大丈夫だと思っていますが、Clangはそうではないと思っています:Compiler Explorer。 すべてのコンパイラは、これが問題ないことに同意しています:コンパイラエクスプローラー。 int main() { constexpr auto p = __func__; constexpr auto p2 = p; constexpr auto sz = p2 - p; return sz; } Clangはこれも好きではありませんが、他のものは問題ありません:Compiler Explorer int main() { constexpr auto p = …

2
どのようにconst exprを非常に速く評価できますか
コンパイル時に評価されるconst式を試してみました。しかし、コンパイル時に実行すると信じられないほど高速に見える例を試してみました。 #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); } int main () { long int res = fib(45); std::cout << res; return 0; } このコードを実行すると、実行に約7秒かかります。ここまでは順調ですね。しかし、私long int res = fib(45)がconst long int res = fib(45)それに変更するとき、それは1秒もかかりません。私の理解では、コンパイル時に評価されます。 しかし、コンパイルには約0.3秒かかります コンパイラーはこれをどのように迅速に評価できますか?しかし、実行時はそれよりはるかに時間がかかりますか?私はgcc 5.4.0を使用しています。
13 c++  const  constexpr 

1
constexprコンストラクターで配列を初期化することは正当ですか?
次のコードは正当ですか? template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; Clangはそれを受け入れますが、GCCとMSVCはそれを拒否します。 GCCのエラーは次のとおりです。 main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = 5]' called in a constant expression 15 …

1
スパンをconstexprにすることはできますか?
std :: spanのすべてのコンストラクターはconstexprと宣言されていますが、それらのいずれかをconstexprコンテキストで動作させることはできません。以下のconstexprのコメントを外すと、コンパイルエラーが発生します。 #include <array> #include <span> int main() { constexpr int carray[3] = { 0, 1, 2 }; constexpr std::array<int, 3> array{ 0, 1, 2 }; using S = std::span<const int, 3>; /*constexpr*/ S span1{ array.data(), 3 }; /*constexpr*/ S span2{array.begin(), array.end()}; /*constexpr*/ S span3{carray}; /*constexpr*/ S span4{array}; } …
11 c++  constexpr  c++20 

1
GCCが不正なconstexprラムダ呼び出しを報告できない
以下は、IIFE(Immediately Called Lambda-Axpression)として表される未定義の動作の2つのテストケースです。 constexpr auto test3 = []{ int* p{}; { int x{}; p = &x; } return *p; // Undefined Behaviour }(); // IIFE constexpr auto test4 = []{ int x = std::numeric_limits<int>::min(); int y = -x; // Undefined Behaviour return y; }(); int main() {} GCCトランクでコンパイルすると、test4で未定義の動作を示すため、正しく拒否されconstexprます。一方、test3受け入れられます。 GCCは受け入れる権利がありますtest3か?

1
参照による `constexpr`メンバー関数の呼び出し-clang vs gcc
次の例を考えてみます(スニペット(0)): struct X { constexpr int get() const { return 0; } }; void foo(const X& x) { constexpr int i = x.get(); } int main() { foo(X{}); } 上記の例は、g++以前のすべてのバージョンでコンパイルされg++ 10.x、でコンパイルされることはありませんclang++。エラーメッセージは次のとおりです。 error: 'x' is not a constant expression 8 | constexpr int i = x.get(); | godbolt.orgの実例 ただしx、の本体で定数式が使用されることはないため、エラーの種類には意味がありますfoo。 X::get()マークされてconstexprおり、の状態には依存しませんx。 に変更const …

5
assert()とstatic_assert()の間でディスパッチする方法、constexprコンテキストに依存するか?
C ++ 11 constexpr関数では、anなどの2番目のステートメントassert()は使用できません。A static_assert()は問題ありませんが、関数が「通常の」関数として呼び出された場合は機能しません。カンマ演算子はwrtoを助けるために来るかもしれません。assert()しかし、醜いですし、いくつかのツールは、それについての警告を吐きます。 アサーションのほかに完全に制約可能な「ゲッター」を検討してください。しかし、実行時とコンパイル時に何らかのアサーションを保持したいのですが、 'constexpr'コンテキストによってはオーバーロードすることはできません。 template<int Size> struct Array { int m_vals[Size]; constexpr const int& getElement( int idx ) const { ASSERT( idx < Size ); // a no-go for constexpr funcs in c++11 // not possible, even in constexpr calls as being pointed out, but what I …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.