問題タブ [explicit-constructor]
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++ - int から vector への暗黙の変換?
vector<T>
ベクトルのサイズを取るコンストラクターがあり、私が知る限り、それは明示的です。これは、次のコードがコンパイルに失敗するという事実によって証明できます
私が理解できず、説明を求めているのは、次のコードがコンパイルされる理由です
コンパイルするだけでなく、実際にグラフのサイズを 5 に変更し、各要素を 5 つのゼロのベクトルに設定します。つまり、私が通常書くコードと同じことを行います。
どのように?なんで?
コンパイラ: MSVC10.0
OK、MSVC のバグのようです (さらに別のバグです)。誰かが回答でバグについて詳しく説明できる場合(つまり、バグが再現された場合を要約する場合)、喜んで受け入れます
c++ - 暗黙の初期化を 0 にオーバーロードできますか?
これらが有効であるようにクラスを書くことは可能ですか:
しかし、これらはそうではありません:
基本的に、私のルールは「定数0
は暗黙的に に変換できFoo
ますが、他の値は変換できません」です。
c++ - c++コンストラクターが呼び出されないのはいつですか?
コンストラクターが呼び出されていないように見える状況があります。
出力は次のとおりです。
(注: Hello2 と Hello3 の間には何もありません)
プログラムを次のように変更すると、次のようになります。
(唯一の違いは、/* 1 */ でマークされた行にあります)
出力は次のとおりです。
ここで、Hello2 と Hello3 の間にコンストラクター呼び出しがあります。私の質問は、最初のケースで (目に見える) コンストラクター呼び出しがないのはなぜですか?
c++ - 明示的な単一パラメーター以外のコンストラクター
単一パラメーター以外のコンストラクターが明示的にコンパイルされる理由を説明できる人はいますか? 私が理解している限り、これはここではまったく役に立たないキーワードですが、なぜこれはエラーなしでコンパイルされるのでしょうか?
c++ - C++ - 明白なコンストラクターの一致がないのに、なぜこのコードはコンパイルされるのですか?
次のコードを検討してください。
私の質問は行 (1) に関するものです。これは、追跡に時間がかかったバグと非常によく似ています。コピー/貼り付けエラーにより、型が 2 回指定されていることに気付きませんでした。正しい行は明らかに次のとおりです。
興味深いことに、この変更も警告なしでコンパイルされるようです。
-Wall -Weverything
これらの例は、フラグを使用しても、clang で警告なしにコンパイルされるのはなぜですか? Foo のインスタンスを有効な引数Foo::Foo(double)
として受け入れるのはなぜですか? double
これは、新しい演算子の特異な動作ですか?
私の元のコードはより大きなコンテキストにあり、2 つの LLVM-3 ベースのコンパイラでテストされました。どちらも警告やエラーなしでコンパイルされました。1 つでは、コードは実際に期待どおりに機能し、実際、バグがあることにしばらく気づきませんでした。もう 1 つの例では、Foo のインスタンスが非常に奇妙に動作しました。正確に説明することはできませんが、返されたポインターの後のコピーが「魔法のように」元の値とは異なる値になり、2 つの協調動作の間で不一致の状態が発生したかのようでした。共有 Foo への同等のポインターを保持するはずだったオブジェクトが、何らかの理由で割り当て後に異なる値を保持していました。ここで何が起こっているのかを理解するまでは、本当に奇妙に思えます!
興味深いことに、以下は両方のコンパイラでコンパイルされます。
しかし、次のバージョンはそうではありません:
c++ - unsigned long long 引数を持つ std::bitset コンストラクターが明示的としてマークされていないのはなぜですか?
標準ライブラリ クラス テンプレートstd::bitset<N>
にはコンストラクターがあります (C++11 以降、unsigned long
C++11 より前の引数)
多くのベスト プラクティス ガイドラインに反して、この単一引数のコンストラクタは としてマークされていませんexplicit
。この背後にある理論的根拠は何ですか?
c++ - C++11: "= {}" を使用したクラス内初期化が明示的なコンストラクターで機能しない
C++11 では、次のように "brace-or-equal-initializer" (標準の単語) を使用してクラス内の初期化を行うことができます。
しかし、コメントを外すとexplicit
、コンパイルされなくなります。GCC 4.7 および 4.9 は次のように述べています。
これは驚くべきことでした。このコードがコンパイルされないのは、本当に C++11 標準の意図ですか?
=
修正を削除します。Foo foo { 42 };
しかし、個人的には、何十年もフォームに慣れている人にこれを説明するのは難しいと思います=
。また、標準では「ブレースまたはイコールイニシャライザー」を参照しているため、古き良き方法がなぜ明らかではないこのシナリオでは機能しません。