問題タブ [in-class-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 前方宣言、unique_ptr、およびクラス内初期化子
Is std::unique_ptr<T> required to know the full definition of T?を読みました。とunique_ptr で前方宣言? 、しかし私の質問はより具体的です。
以下がコンパイルされます。
以下はしません:
エラー
編集:私が理解している限り、ここで起こっていることは、クラス内イニシャライザがunique_ptr<A>
の宣言の時点ですでに初期化できることを意味することですAUser
。型unique_ptr<A>
は実際unique_ptr<A, default_delete<A>>
には であるため、初期化できるということは初期化できるということdefault_delete<A>
です。そのためにA
は、完全に定義する必要があります。
この推論の弱点は、クラス内イニシャライザが、クラスの宣言時にそれぞれのデータ メンバを初期化する機能を意味するという仮定です! 初期化子は宣言の一部であるため、これは直感的な自明のようです。しかし、標準で明示的にそれを述べている何かを見つけた場合、私はより快適になります。そうでなければ、それを必要としない実装ソリューションをまだ考えることができます。たとえば、コンパイラは単純にイニシャライザ式を取得し、属性の初期化が明示的に指定されていないコンストラクタにのみ適用できます。
それで、2番目のケースで A の完全な定義の必要性を暗示する標準セクション/抜粋を誰かに紹介してもらえますか? 標準のクラス内イニシャライザについてはあまり見つけられませんでした (「非静的データ メンバのブレースまたはイコール イニシャライザ」と呼ばれるものしか見つかりませんでした) が、これに関連するものは何もありませんでした。
c++ - クラスの初期化および初期化子リスト内
私は最近、クラスの初期化と初期化リストで同時に持つことができないことを発見しました。次のコードは失敗します:
クラス内の初期化を削除すると、初期化子リストは正常に機能します!
そのようなことが許可されていない理由を誰かが説明できますか?
c++ - 統一された初期化構文を使用した初期化子リストによるクラス内メンバーの初期化?
MSVC2013で以下をコンパイルしようとしています:
コンパイラは私に次のエラーを与えます:SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.
コードを次のように変更すると:
プログラムはコンパイルされ、正常に実行されます。これはコンパイラの問題ですか、それとも構文を理解していませんか? 私が読んでいることから、最初のバージョンはコンパイルされるはずです。
c++ - ISO C++ では、構造体内でのメンバーの初期化が禁止されています
私はエミュレーターを書いていて、構造体内で入出力エミュレーションを制御することにしました:
上記のコードは私には問題ないように見え、すべてのルールに従っているように見えます...しかし、上記のタイトルに記載されているエラーメッセージが表示されます。私は周りを検索し、人々はエラーが別のことを意味すると言います.しかし、それは何ですか?
問題は「LastFrequency」に向けられています。
c++ - Inheriting-Constructors + In-Class-Initialization の非デフォルト コンストラクト型の失敗
プロジェクトで次のエラーが発生します。
これは私が使用しているコードです:
なぜこれが起こっているのか誰にも分かりますか?
明らかに、言語は継承されたコンストラクターの最後に初期化を追加しても構わないと思っています (既定のコンストラクターを呼び出す意思があるため)。そして明らかに、明示的に定義されたコンストラクターの最後に、デフォルト以外のコンストラクター (クラス内の初期化) への呼び出しを暗黙的に追加する意思があります。しかし、私には理解できない何らかの理由で、両方を同時に実行するつもりはありません。
この質問によると、完全な転送は実際には完全ではなく、ここでは使用しないでください。
注: 実際の場合、のコンストラクターB
ははるかに複雑であり、変更される可能性があるため、手動で転送することは実際には実行可能なオプションではありません。
c++ - C++11: "= {}" を使用したクラス内初期化が明示的なコンストラクターで機能しない
C++11 では、次のように "brace-or-equal-initializer" (標準の単語) を使用してクラス内の初期化を行うことができます。
しかし、コメントを外すとexplicit
、コンパイルされなくなります。GCC 4.7 および 4.9 は次のように述べています。
これは驚くべきことでした。このコードがコンパイルされないのは、本当に C++11 標準の意図ですか?
=
修正を削除します。Foo foo { 42 };
しかし、個人的には、何十年もフォームに慣れている人にこれを説明するのは難しいと思います=
。また、標準では「ブレースまたはイコールイニシャライザー」を参照しているため、古き良き方法がなぜ明らかではないこのシナリオでは機能しません。
c++ - クラス内の一意のポインターの初期化
unique_ptr
クラス内で初期化したいメンバー オブジェクトがあるとします。以下のコードを参照してください。均一な初期化 (中括弧) を使用する必要があるのはなぜですか? 2 番目の宣言は、次のようなエラーを吐き出します。
そして、これが最も厄介な解析の問題だとは思いません。少なくともそうは思いません。
c++ - メンバー変数の初期化文字列から配列サイズを推測できない理由は何ですか?
次のコードを検討してください。
g ++とclang ++の両方でコンパイルに失敗し、本質的に吐き出します
error: array bound cannot be deduced from an in-class initializer
これはおそらく標準が言っていることだと思いますが、それには何か特別な理由がありますか? const
文字列リテラルがあるため、クラス外のC のような null で終了する文字列を宣言する場合と同様に、コンパイラは問題なくサイズを推測できるようです。