問題タブ [copy-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++ - テンプレート クラスに一致する関数がありません
このコードを mingw32 コンパイラでコンパイルしようとすると、一致するメンバー関数エラーが発生しません
誰か問題の解き方を教えてください。
c++ - いつ直接初期化を使用し、いつコピー初期化を使用する必要がありますか?
それは単に好みですか、それとも特定のインスタンスが必要な場合がありますか? 初期化のために次のバリアントを参照しています
c++ - コピー初期化の奇妙な動作、コピー コンストラクターを呼び出さない!
直接初期化とコピー初期化の違いを読んでいました(§8.5/12):
copy-initializationについて読んで理解したのは、アクセス可能で非明示的な copy-constructorが必要であるということです。そうしないと、プログラムがコンパイルされません。次のコードを書いて確認しました。
GCC は次のようなエラー ( ideone )を返します。
prog.cpp:8: エラー: 'A::A(const A&)' は非公開です
これまでのところ、すべて順調で、ハーブ・サッターの言葉を再確認しました。
コピーの初期化とは、必要に応じて最初にユーザー定義の変換を呼び出した後、コピー コンストラクターを使用してオブジェクトが初期化されることを意味し、"T t = u;" の形式と同等です。
private
その後、キーワードにコメントを付けて copy-ctor にアクセスできるようにしました。さて、当然のことながら、次のものが印刷されることを期待しています。
A(定数 A&)
しかし驚いたことに、代わりにこれを出力します ( ideone ):
A(int i)
なんで?
わかりました。まず、を使用して、必要に応じてここで変換規則を適用して (§8.5/14)、その型から型の一時オブジェクトを作成し、次に copy-ctor を呼び出して を初期化することになっていることを理解しA
ました。しかし、そうではありませんでした。なんで?10
int
A(int i)
a
copy-constructor (§8.5/14) を呼び出す必要をなくす実装が許可されている場合、copy-constructor が宣言されているときにコードを受け入れないのはなぜprivate
ですか? 結局のところ、それはそれを呼んでいません。それは甘やかされて育った子供が、最初はいらいらして特定のおもちゃを要求し、あなたが彼に特定のおもちゃを与えると、あなたの後ろに捨ててしまうようなものです. :|
この動作は危険でしょうか? つまり、copy-ctor で何か他の便利なことをするかもしれませんが、それが呼び出されない場合、プログラムの動作は変更されませんか?
php - PHP OOP での $a=&$b 、 $a = $b 、 $a= clone $b の違い
$a = &$b
とPHP OOP$a = $b
の違いは何ですか? クラスのインスタンスです。$b = clone $a
$a
c++ - POD 変数の直接初期化は機能しませんが、変数をベクターにプッシュする場合はコピー初期化が機能します
次のコードはコンパイルに失敗するのに、後の 2 つの例は正常にコンパイルされるのはなぜですか? Windows 7 で VS 2008 を使用しています。
POD の直接初期化 (失敗):
POD のコピー初期化 (成功:
c++ - コピーの初期化がそのようになっているのはなぜですか? なぜコピーコンストラクターが必要なのですか?
重複の可能性:
コピーと直接初期化の動作が異なる理由は何ですか?
そして、コピーの初期化とは、次のように意味します。
何年もの間 C++ でプログラミングを行っていましたが、上記のコードにコピー コンストラクターが必要であることに気づきませんでした (jogojapan に感謝します)。一時的なものは常に省略されていたので、指摘されるまで、それが存在することすら知りませんでした(少なくとも表面的なレベルでは、最適化されているにもかかわらず)。
かなりの量のグーグルの後、私はそれがどのように機能するかを理解します。私の質問は、なぜそれがそのようになっているのですか?
上記の例でコピー コンストラクターが不要になるように、標準で作成しなかったのはなぜですか? このタイプの初期化でコピーコンストラクターを要求することが重要であることを示す特定のケース/例はありますか?
なぜそうなっているかについての適切な説明がなければ、私はこれを迷惑なアーティファクトと見なすだけですが、何か重要なものが欠けている場合は、無知である必要はありません.
c++ - C++コピーの初期化+暗黙のコンストラクター呼び出し=失敗
このコード:
行のエラーbar b = 3
(g ++ 4.7.1 with -fstd=gnu++11
):
ただし、を受け取るbar
コンストラクターを提供していfoo
ます。intは、その前の行に示されているように暗黙的に変換できますfoo
。では、何が問題になっていますか?
ちなみに、いくつかの理由から、変換を強制的にfoo
使用することは望ましくfoo(3)
ありません。これは、実際のコードを使用して読み取るのが醜くなるためです。
c++ - C++(11): 直接初期化またはコピー初期化の両方が問題ない場合にいつ使用するか
重複の叫びが始まる前に: 次の質問 (およびその他の質問) がこの質問に非常に関連していることを認識しています。
コピー初期化と直接初期化の間に C++ の違いはありますか?
この質問の回答は、コピーの初期化が不可能なシナリオを完全に説明し、2 つの違いとそのすべてを説明しています。ただし、私の質問はより微妙です。
次のコードを検討してください。
A は暗黙的にコピー構築できると仮定すると、 と の両方の初期化は問題a1
ありませんa2
。のコピー コンストラクターには副作用がないA
ため、両方の初期化も意味的に同等です。createA()
最初にキャストする必要があるものではなく、変数の型を直接返します。このケースはかなり多いと思います。
したがって、この場合、両方の選択肢が等しく適用可能であり、意味的に同等である場合、どちらを使用する必要がありますか? 仕様またはコミュニティのコンセンサス/ベストプラクティスに推奨事項はありますか?それとも、どちらを使用するかは私と私のコーディングスタイル次第ですか? C++11 は、古い標準と比較して何か違いを導入しましたか?
c++ - 文字列から文字列ストリームをコピー初期化できないのはなぜですか?
次のコードは、GCC、Clang、および Visual Studio で失敗します。
直接初期化が機能し、コピー初期化が機能しない唯一のケースは、コンストラクターが明示的である場合であると考えましたが、この場合はそうではありません。どうしたの?