問題タブ [value-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++ - 明示的な型変換と複数の単純型指定子
type のオブジェクトを値初期化するT
には、次のいずれかの行に沿って何かを行います。
私の質問は、単純な型指定子の組み合わせによって指定される型に関するものですunsigned int
。
Visual C++ 2008 およびインテル C++ コンパイラー 11.1 は、これらの両方を警告なしで受け入れます。Comeau 4.3.10.1b2 と g++ 3.4.5 (確かに、特に最近ではありません) にはありません。
C++ 標準 (C++03 5.2.3/2、expr.type.conv) によると:
式は
T()
、T
非配列完全オブジェクト型または (おそらく cv 修飾された)void
型の単純型指定子 (7.1.5.2) であり、指定された型の右辺値を作成します。これは値で初期化されます。
unsigned
7.1.5.2 は、「単純な型指定子は次のとおりです」と述べ、とを含むリストが続きますint
。
したがって、5.2.3/2 では「simple-type-specifier」が単数でありunsigned
、int
2 つの型指定子であることを考えると、上記の使用例はunsigned int
無効ですか? (もしそうなら、フォローアップは、Microsoft と Intel が上記の表現をサポートするのは間違っていますか?)
この質問は、何よりも好奇心からのものです。複数の単純な型指定子の組み合わせによって指定されたすべての型について、値の初期化はゼロの初期化と同等です。(この質問は、この初期化に関する質問への回答に対するコメントによって促されました)。
c++ - コピー不可能なオブジェクトと値の初期化: g++ と msvc
コピー不可能なオブジェクトの値の初期化に関して、g++ と msvc の間でいくつかの異なる動作が見られます。コピー不可能なクラスを考えてみましょう:
タイプが POD の場合でも値が既知の値になるように、値の初期化を使用するテンプレート:
そしてそれらを一緒に使用しようとしています:
これは、VC++ 9.0 の時点で msvc で正常に動作しますが、コピー コンストラクターがプライベートであるため、これをテストした g++ のすべてのバージョン (バージョン 4.5.0 を含む) で失敗します。
2 つの質問:
- 標準に準拠しているのはどの動作ですか?
- gcc でこれを回避する方法の提案 (明確にするために、これを変更すること
T t;
は、POD タイプを壊すため、受け入れられる解決策ではありません)。
PS boost::noncopyable でも同じ問題が発生します。
c++ - 値の初期化と非PODタイプ
1時間前、私はここに答えを投稿しましたが、それは私によれば正しかったです。しかし、私の答えはマーティンBによって反対されました。彼は言った
私が置かれたメモリがたまたまゼロで初期化されたので、あなたは幸運でゼロを取得しています。これは規格によって保証されていません。
ただし、ここでMichael Burrの回答を読み、次のサンプルコードを試した後
1)
MSVC++2010でデバッグエラーが発生しました。
MSVC ++ 2010で次のコード[ここに私の答え]を試したときに、同様のエラーが発生しました
2)
MSVC++2010がC++03をサポートしていないかどうかを考えさせられる、gcc/Clangでのそのようなエラーも発生し(1)
ませんでした。(2)
私はわかりません。
MichaelBurrの投稿によると[C++03で]
new B()- value-デフォルトのctorはユーザー定義ではなくコンパイラー生成であるため、すべてのフィールドをゼロで初期化するBを値初期化します。
規格によると
タイプTmeansのオブジェクトを値初期化するには:
— Tがユーザー宣言コンストラクター(12.1)を持つクラスタイプ(9節)の場合、Tのデフォルトコンストラクターが呼び出されます(アクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります)。
....。
それ以外の場合、オブジェクトはゼロで初期化されます
最初のポイントから、ユーザーが宣言したデフォルトコンストラクターがない場合、コンパイラーで合成されたデフォルトコンストラクターが呼び出されzero initialize
、すべてのフィールドが呼び出されます(最後のポイントによる)。
それで、私はどこが間違っていますか?値の初期化の私の解釈は正しいですか?
c++ - IdeoneとCodepadは本当にC++03をサポートしていませんか?
私の質問は、非PODタイプと値の初期化に関するPrasoonの質問に関連しています。
IdeoneやCodepadなどのオンラインコンパイラで次のコードを試しましたが、実行可能ファイルによって両方のサイトでランタイムエラーが発生しました。
それは、どちらもC ++ 03値の初期化機能をサポートしていないことを意味しますか?
c++ - 組み込み型にはデフォルトのコンストラクターがありますか?
この記事を読んだ後int ()
、一時int
は値で初期化int()
されており、のデフォルトコンストラクターを呼び出すためではなく、0を生成することを指摘しましたint
。(私の理解によると、記事には欠陥があります。)
また、プリミティブ(組み込み)型にはコンストラクターがないことも言いました。元の作者は私にセクション$10.4.2(TC ++ PL)をチェックするように頼みました。
組み込み型にはデフォルトのコンストラクターもあります($ 6.2.8)
しかし、「C ++では、組み込み型(プリミティブ型)でもデフォルトのコンストラクターを使用できる」というステートメントはまだあると思います。欠陥があります(C ++ 03による)。
TC ++ PLのBjarneは、「表記法のようなコンストラク()
ター」と実際のコンストラクター呼び出しを混同していると思います。Bjarneが本を書いていた当時、値の初期化は導入されていませんでしたね。では、C++98およびC++03のように、TC ++ PLのテキストは正しくありませんか?
皆さんはどう思いますか?
編集
私はBjarneに個人的に(メールで)TC ++ PLの欠陥のあるテキストについて尋ねました、そしてこれは彼の返事でした
「実際のコンストラクター呼び出し」と概念的にコンストラクターを持つことを混同していると思います。 組み込み型にはコンストラクターがあると見なされます(標準がその動作を説明するために使用する単語は何でも)。
c++ - 値初期化集計
C++ 標準を試してみましたが、わかりませんでした。これらは同等ですか?
と
これらはどうですか?
と
ありがとうございました!
c++ - レガシーコードを壊さずに既存の構造体にメンバーを追加する
私が使用しているいくつかのレガシーコードには、次の定義があります。
この構造体に新しいメンバーを追加したい:
ただし、VlanData
レガシーコードでは、の使用にかなりの一貫性がありませんでした。
構築時に初期化されていません:
初期化された値:
私がやりたいのは、多くのコードを更新せずに、レガシーコードで`mVlanPriority'が自動的に0に設定されるようにする安全な方法を考え出すことです。
レガシーコードを変更して、次のようにすべてのメンバーを値初期化できることを理解しています。
しかし、このコードをすべて更新する必要はありません。このようなデフォルトのコンストラクターを作成すると、次のことが役立つと思います。
しかし、これはPOD
構造体の性質も破壊します。
だから私はいくつかの質問があると思います:
mVlanPriority
レガシーコードを更新せずにレガシーコードで0に設定されて いることを確認できる安全な方法はありますか?POD
これがタイプでなくなった場合、クラスのどのような使用が中断されますか?
c++ - 「値の初期化」とはどういう意味ですか?
たとえば、クラスがある場合:
オブジェクトを作成するために使用したもの、
情報の横の括弧は、私がそれを初期化する価値があることを意味しますか?これとどう違うのInfo *p = new Info;
?
新しいC++言語と古いC++言語の異なる意味を区別する質問があることは知っていますが、デフォルトと値の初期化の意味の違いを知りたいです。たとえば、値の初期化は何かをゼロに初期化することを意味しますか?
c++ - この単純な割り当てが未定義の動作であるのはなぜですか?
私は値の初期化とデフォルトの初期化の理解を新たにしていて、これに出くわしました:
どうやらこれはUBです
C()の場合、xおよびyメンバーを初期化できるコンストラクターがあるため、初期化は行われません。したがって、C()をcにコピーしようとすると、未定義の動作が発生します。
理由は理解できたと思いますが、よくわかりません。誰かが詳しく説明してもらえますか?
これもUBだということですか?
ちなみに、値の初期化に関して、以下はゼロであることが保証されていますか?
c++ - デフォルトの初期化と値の初期化、または配列のすべてまたは一部を選択できますか?
C++2003 以降、値の初期化とデフォルトの初期化があります。つまり:
右?
今、私はこのクラスを持っているとします
のコンストラクターを作成するとき、親クラスまたはメンバーBar
のいずれかをデフォルトまたは値で初期化したい場合があります。f[]
親を初期化するための選択は単純だと思います:
しかし、f[]
メンバーはどうですか?
- すべてのメンバーをデフォルトで初期化するにはどうすればよいですか?
- すべてのメンバーの値を初期化するにはどうすればよいですか?
- C++11 イニシャライザ リストを使用する場合、イニシャライザ リストのサイズが と異なるとどうなり
SIZE
ますか?