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

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


14
C ++ 11でconstexpr機能を使用する必要があるのはいつですか?
「常に5を返す関数」を持つことは、「関数を呼び出す」という意味を壊したり弱めたりしているように思えます。理由があるか、この機能が必要であるか、C ++ 11にはないでしょう。なぜそこにあるのですか? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife = 42; // constexpr-function: constexpr int MeaningOfLife () { return 42; } 私がリテラル値を返す関数を書いて、コードレビューにたどり着いたら、誰かが私に言ったので、return 5を書く代わりに定数値を宣言する必要があります。
337 c++  c++11  constexpr 


2
関数内の静的constexpr変数は意味がありますか?
関数(たとえば、大きな配列)内に変数がある場合、両方staticとそれを宣言することは意味がありconstexprますか?constexpr配列がコンパイル時に作成されることを保証するので、static役に立たないでしょうか? void f() { static constexpr int x [] = { // a few thousand elements }; // do something with the array } されstatic、実際に生成されたコードや意味論の面でそこに何かをやって?
192 c++  static  c++11  constexpr 

6
静的constexpr char []への未定義の参照
static const charクラスに配列が必要です。GCCは不平を言って、私はを使用するべきだと私に言ったconstexprが、今は未定義の参照であることを私に言っている。配列を非メンバーにすると、コンパイルされます。何が起こっている? // .hpp struct foo { void bar(); static constexpr char baz[] = "quz"; }; // .cpp void foo::bar() { std::string str(baz); // undefined reference to baz }

4
constexprでstd :: stringを使用することは可能ですか?
C ++ 11、Ubuntu 14.04、GCCデフォルトツールチェーンを使用します。 このコードは失敗します: constexpr std::string constString = "constString"; エラー:constexpr変数 'c​​onstString'のタイプ 'const string {aka const std :: basic_string}'はリテラルではありません... 'std :: basic_string'は自明でないデストラクタを持っているためです それを使用することが可能であるstd::stringにconstexpr?(どうやらそうではない...)もしそうなら、どうやって?で文字列を使用する別の方法はありconstexprますか?

2
constexprはインラインを意味しますか?
次のインライン関数について考えてみます。 // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } そしてconstexprの同等バージョン: // Constexpr specifier version #include<iostream> #include<cstdlib> constexpr int f(const int x); constexpr int f(const int x) { return 2*x; …

2
C ++で「関数を汚染する」とはどういう意味ですか?
CppConでのスコットシュラーの講演「紹介constexpr」の最後に、「機能を害する方法はありますか」と尋ねます。次に、これは(非標準的な方法ではありますが)次の方法で実行できることを説明します。 関数throwにaを置くconstexpr 未解決の宣言 extern const char* 未解決の参照externにthrow 私はここで自分の深みから少し外れているように感じますが、私は興味があります: 「機能を害する」とはどういう意味ですか? 彼が概説するテクニックの重要性/有用性は何ですか?
96 c++  constexpr 

3
Constexprとマクロ
マクロの使用をどこで好むべきで、constexprをどこで好むべきですか?基本的に同じではないですか? #define MAX_HEIGHT 720 vs constexpr unsigned int max_height = 720;
95 c++  c++11  macros  constexpr 

6
コンパイル時のC文字列の長さの計算。これは本当にconstexprですか?
コンパイル時に文字列リテラルの長さを計算しようとしています。これを行うには、次のコードを使用しています。 #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } すべてが期待どおりに機能し、プログラムは4と8を出力します。clangによって生成されたアセンブリコードは、結果がコンパイル時に計算されることを示しています。 0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d" 0x100000f65: movl $0x4, %esi 0x100000f6a: movl $0x8, %edx 0x100000f6f: xorl %eax, %eax 0x100000f71: callq …

3
コンパイル時に多次元std :: vectorの深さを取得するにはどうすればよいですか?
多次元を取りstd::vector、深さ(または次元数)をテンプレートパラメーターとして渡す必要がある関数があります。この値をハードコーディングする代わりに、を使用して深さを値として返すconstexpr関数を作成します。std::vectorunsigned integer 例えば: std::vector<std::vector<std::vector<int>>> v = { { { 0, 1}, { 2, 3 } }, { { 4, 5}, { 6, 7 } }, }; // Returns 3 size_t depth = GetDepth(v); この深さはテンプレート関数としてテンプレート関数に渡されるため、コンパイル時にこれを行う必要があります。 // Same as calling foo<3>(v); foo<GetDepth(v)>(v); これを行う方法はありますか?

1
C ++コンパイル時間カウンター、再訪
TL; DR この投稿全体を読む前に、次のことを知っておいてください。 提示された問題の解決策は自分で見つけましたが、分析が正しいかどうかを知りたいと思っています。 fameta::counter残りのいくつかの癖を解決するクラスにソリューションをパッケージ化しました。githubで見つけることができます。 godboltの作業でそれを見ることができます。 すべての始まり FilipRoséenが発見/発明して以来、2015年に、時間カウンターをコンパイルするブラックマジックはC ++にあるため、デバイスにややこだわっていたため、CWG が機能を実行する必要があると判断したときはがっかりしましたが、彼らの心はいくつかの説得力のある使用例を示すことで変更できます。 次に、数年前、私はそのことをもう一度確認することにしました。これにより、uberswitch esを入れ子にできるようになりました-私の意見では興味深いユースケースです- の新しいバージョンではもはや機能しないことを発見しただけです。問題2118がオープン状態であっても(現在も)利用可能なコンパイラー:コードはコンパイルされますが、カウンターは増加しません。 この問題は、RoséenのWebサイト、および最近ではstackoverflowでも報告されています。C++はコンパイル時カウンターをサポートしていますか? 数日前、もう一度問題に取り組み、取り組むことを決めました コンパイラーの何が変わったのかを理解したかったのです。そのために、私は誰かがそれについて話してくれるようにインターウェブをずっと遠くまで検索しましたが、役に立ちませんでした。だから私は実験を始め、いくつかの結論に達しました。私はここで提示しているのですが、ここでは自分よりも知識のある人からフィードバックを得たいと思っています。 以下では、わかりやすくするために、Roséenの元のコードを示します。それがどのように機能するかの説明については、彼のウェブサイトを参照してください: template<int N> struct flag { friend constexpr int adl_flag (flag<N>); }; template<int N> struct writer { friend constexpr int adl_flag (flag<N>) { return N; } static constexpr int value = N; }; template<int …

1
グローバルconst char []をconstexpr string_viewに置き換える落とし穴はありますか?
私たちのチームは10年以上前のC ++コードベースで作業しており、最近C ++ 17コンパイラに切り替えました。そこで、コードを最新化する方法を探しています。YouTubeでのカンファレンストークで、const char*グローバル文字列をに置き換えるという提案を聞きましたconstexpr string_view。 const char*コードにはこのようなグローバル文字列定数が多数含まれているので、知っておく必要のある問題や潜在的な問題がないか確認したいのですが。

1
std :: pair <auto、auto>戻り値の型
で遊んでいましautoたstd::pair。以下のコードでfは、関数はstd::pairテンプレートパラメータに依存するタイプのを返すことになっています。 実際の例: 例1 template &lt;unsigned S&gt; auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return std::pair{1.0, 2.0}; // pair of doubles else return std::pair{0.0f, 0.0f}; // pair of floats } これは、gcc 9.2、gcc 10.0、clang 9.0およびclang 10.0で動作します。 次に、明確にするために戻り値の型を明示的に記述したいと思いstd::pairます。 例2 …

2
C ++ 20の前にstd :: swapがconstexprとマークされていないのはなぜですか?
C ++ 20ではstd::swap、constexpr関数になります。 標準ライブラリは、マーキングの点constexprで言語に遅れを取っていることを知っていますが、2017年まで&lt;algorithm&gt;に、他の多くのものと同様にconstexprになりました。まだ-ありstd::swapませんでした。そのマーキングを妨げる奇妙な言語の欠陥があったことを漠然と覚えていますが、詳細を忘れています。 誰かがこれを簡潔かつ明確に説明できますか? 動機:C ++ 11 / C ++ 14コードで-のstd::swap()ような関数をマークすることがなぜ悪い考えであるのかを理解する必要がありconstexprます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.