問題タブ [uniform-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++ - 未使用の変数を報告する {} による均一な初期化
このコードを g++ 4.7.0 でコンパイルすると ( -Wall -Wextra -Werror -Wconversion -std=c++11
):
...次のエラーが発生します。
bar
初期化を次のいずれかに変更することで、エラーを取り除くことができます。
bar
初期化が変更されると、出力は常に次のようになります。
bar
元の初期化で未使用の変数が報告されるのはなぜですか?
c++ - 一様な初期化で初期化子リストの参照を初期化できないのはなぜですか?
つまり、なぜこれを行うのですか:
GCC 4.7 でコンパイラ エラーが発生する場合:
?
エラーを修正するには、 を に変更する必要がありs{s}
ますs(s)
。これは、均一な初期化の均一性を壊しませんか?
編集:clangで試してみたところ、clangはそれを受け入れたので、おそらくGCCのバグですか?
c++ - 動的オブジェクトの均一な初期化
一様な初期化は動的オブジェクトでは機能しませんか、それとも g++ 4.6.1 の欠点ですか?
g++ 4.7.1 で動作しますが、別のクラスから継承する場合、両方の行main
がコンパイルに失敗します。foo
繰り返しますが、私のコンパイラの欠点ですか? それとも、均一な初期化は継承でうまく機能しませんか?
c++ - 均一な初期化を使用するこのスニペットがg++4.6でコンパイルされるのに、g ++ 4.7ではコンパイルされないのはなぜですか?
派生は、C++11の統一初期化構文を使用して基本クラスコンストラクターを呼び出すことに注意してください。
g ++ 4.6はこれをコンパイルしますが、g++4.7はコンパイルしません。
どうしたの?
アップデート1:clang ++-3.1で警告なしにコンパイルされます
アップデート2:確かにコンパイラのバグのようです。明らかにGCC4.7.3で修正されています。
c++ - 自明な ctor を使用した派生クラスの均一な初期化
C ++ 11の均一な初期化を使用して、いくつかのコーナーケースに頭を悩ませようとしていますが、これがなぜなのかわかりません:
2とマークされた行は、との両方で「Derived の初期化に一致するコンストラクターがありません」というメッセージで失敗します。clang 3.1
g++ 4.7
Derived の場合、コンストラクターを呼び出そうとしても実行されない理由がわかりません (1 行目の場合のように、コンストラクターを呼び出す方法がわかりません。おそらく集約初期化ですか?)。
次の推論のどこかが間違っていますか?:
A) 些細なことで、静的に初期化できることが保証されます
B)静的に初期化するには、実行時にコードを実行する必要がないため、コンストラクターの呼び出しは必要ありません
A+B
=>自明であることがわかっている型でコンストラクターを呼び出そうとするのはなぜですか?
私は非常に混乱しています....
c++ - C++ 11 の均一な初期化での「構造体初期化子の過剰な要素」エラー
次のコンパイラ エラーに驚いています。
エラーは(clangで):
GCC でも同様のエラーが発生します。
式がからt_{t}
構成をコピーしようとすることを期待します。暗黙的に生成されたコピー コンストラクターがあるため、これが問題になることはないと思います。t_
t
S
誰かがここで何が起こっているのか説明できますか?
c++ - 均一な初期化を使用してオブジェクトを構築する単純なプログラムはコンパイルに失敗します
次のプログラムを検討してください。
GCC 4.7.2、GCC 4.8.0、およびClang 3.2でコンパイルすると、このプログラムは次のことを行います(*)。
- 次に、値をコンストラクターに
X
渡す型の一時を構築します。0
1
- 移動-
X
その一時的なものから構築します。
代わりに、ICC 13.0.1では、コンパイルされません。
質問#1:誰が正しいですか?
(*)実際には、一時の作成とmoveコンストラクターの呼び出しは省略されていますが、-fno-elide-constructors
オプションを使用してコンパイルし、コンストラクターにいくつかの印刷出力を追加すると、これが行われていることがわかります。
ここで、上記のプログラムのわずかなバリエーションを考えてみましょう。ここでは、均一な初期化を使用して直接初期化していますx
。
括弧の代わりに中括弧を使用してここで何かを変更することは期待していませんが、どういうわけかそうです。このプログラムは、テストしたコンパイラ(Clang 3.2、GCC 4.7.2、GCC 4.8)ではコンパイルされません。 0ベータ、およびICC 13.0.1)。
質問2:なぜですか?
c++11 - 移動コンストラクターを実行できません
C++11
move コンストラクターの使用に問題があります。という単純なコンテナ クラスがありNumber
、その唯一のデータ メンバは整数です。次のコードがあります。
と
と
これは以下を出力します:
パート D の出力がないことに注意してください。パート A と B の出力は期待どおりですが、その他の出力はそうではありません。
パート C と D でこれを期待していました。
パート C の期待:
Number{n1}
の部分はNumber n3{Number{n1}}
一時的な名前のないNumber
オブジェクトを作成することを期待していNumber
ましたn1
。Number n3
次に、一時オブジェクトを使用して移動コンストラクターを呼び出すことで構築されることを期待していました。
パートDへの期待:
これはパート C に似ていますが、中括弧の代わりに括弧が使用されている点を除けば、このパートがパート C と同じように動作し、出力されることを期待していました。
質問:
実際の出力が期待と異なるのはなぜですか? また、目的の出力を得る正しい方法は何ですか?
注:これを Visual Studio でコンパイルする場合は、統一された初期化構文をサポートするために、Visual Studio 2012 用のVisual C++ コンパイラ 2012 年 11 月 CTP以降が必要です。
c++ - 整数のベクトルのベクトルでの一様な初期化
C++11
このプログラムは、 のvector
namedmyVec
を初期化しint
vector
、ループを使用して各 innervector
の要素を出力します。しかし、追加の中括弧を使用するとどうなるかを確認しようとすると、予期しない結果が得られました。以下もこの LiveWorkSpaceにあり、コンパイラを簡単に切り替えることができます。g++ 4.8.0
までしかコンパイルできませんmyVec[5]
。clang++ 3.2
すべてをコンパイルします:
実際のg++ 4.8.0
出力:
分析:
myVec[0]
: {1, 2}
:
期待どおりの出力が得られました。
myVec[1]
: {}
:
期待どおりの出力が得られました。
myVec[2]
: {{}}
:
これは のベクトルですint
0
。内側のブレースは to を初期化int
し0
ます。
myVec[3]
: { {}, {} }
:
2 つの内側の中括弧は、int
each を に初期化し0
ます。
myVec[4]
: { {}, {}, {} }
:
3 つの内側の中かっこは、int
each を に初期化し0
ます。
myVec[5]
: {{{}}}
:
myVec[2]
中括弧をさらに追加して、コンパイラ エラーが発生する前に中括弧をどこまで追加できるかを確認したかったのです。これがコンパイルされる理由と、その要素が として出力される理由がわかりません0
。
たとえば、 にint j = {}
初期化j
され0
ます。vector<vector<int>> v = { {{}} }
最も内側{}
をに初期化しint
0
、 と同等にしvector<vector<int>> v = { {0} }
ます。では、それは何でvector<vector<int>> u = { {{{}}} }
、なぜコンパイルされるのでしょうか?
仮説myVec[6]
: { {{}}, {{}} }
:
上記と同じパターンに従って、2 組の二重中括弧を含むベクターを作成したいと考えました。しかし、これはコンパイルされません。なぜこれが複数のゼロを与えるパターンを破るのか理解できません。
仮説myVec[7]
: {{{{}}}}
:
myVec[5]
中括弧をさらに追加して、コンパイラ エラーが発生する前に中括弧をどこまで追加できるかを確認したかったのです。これがパターンを壊してコンパイルしない理由がわかりません。
仮説myVec[8]
: { {{{}}}, {{{}}} }
:
myVec[7]
2 組の三重ブレースを使用してベクトルを作成するように拡張したかったのです。これがコンパイルされない理由もわかりません。
までのすべてがmyVec[5]
コンパイルされた場合、残りはなぜコンパイルされないのですか?
c++ - Attempted construction of temporary object using only class name in declaration
C++
Objects of this class cout
s messages when they are constructed and destroyed. I tried to construct a temporary object using a declaration of only the class name, but it gave an unexpected output.
In #1, I instantiate a temporary nameless object using parentheses.
In #2, I instantiate a temporary nameless object using uniform initialization.
I didn't know whether #3 would compile. I only thought that if #3 were to compile, it would signify a construction of a temporary nameless object. It does compile, but no object is constructed as seen from the blankness of the console output under #3. What is happening here?
Console Output:
Note: This was compiled in VC11 with November 2012 CTP. It doesn't compile in g++ 4.8.0 or clang 3.2, which gives error: declaration does not declare anything [-fpermissive]
and fatal error: 'iostream' file not found
, respectively.