問題タブ [language-lawyer]
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++ - 静的メソッドが基本クラスの非静的メソッドをオーバーライドするのはなぜですか?
メンバー メソッドとstatic
メンバー メソッドは、次の 2 つの理由でまったく異なります。
static
メソッドはベースの仮想関数をオーバーライドしませんclass
- 両方のケースの関数ポインターの署名が異なります
メソッドがオブジェクトから呼び出された場合、論理的にメンバ メソッドの方が優先されるべきではありませんか? (C++ ではstatic
、オブジェクトを使用してメソッドを呼び出すことができますが、それはオーバーライドされたメソッドと見なされますか?)
c++ - この左辺値から右辺値への変換を義務付ける標準条項はどれですか?
与えられた:
オブジェクトの初期化において、左辺値x
から右辺値への式の変換を義務付けている標準 (2003 年推奨) のどの句を教えてください。y
(または、私が間違っていてそのような変換が行われない場合は、それも学びたいです!)
c++ - 同じ「auto」宣言で基本クラスが自動的に推定されないのはなぜですか?
に関連する以下のエラーauto
は理解できます。
ただし、以下が同じエラーの犠牲になる理由:
それを知っていて、b1
すでに推論されているconst B&
ので、コンパイラb2
も作成を試みることはできませんconst B&
か?b2
(つまり、推定された場合にどのような危険が生じる可能性がありconst B&
ますか?)
c - printf("% .0d",0) はスペースを出力する必要がありますか? printf("%+.0d",0) プラスを出力しますか?
glibcprintf("% .0d",0)
はスペースをprintf("%+.0d",0)
出力し、プラス記号を出力します。glib の printf テストはこの動作をチェックします。しかし、それは正しいですか?標準 (7.19.6.1) から:
+ 符号付き変換の結果は、常にプラス記号またはマイナス記号で始まります。(このフラグが指定されていない場合、負の値が変換される場合にのみ符号で始まります。)
スペース 符号付き変換の最初の文字が符号でない場合、または符号付き変換の結果が文字にならない場合は、結果の前にスペースが追加されます。スペース フラグと + フラグの両方が表示される場合、スペース フラグは無視されます。
ただし、d
指定子の精度に関して:
ゼロ値を精度ゼロで変換した結果は、文字がありません。
当然、この「文字なし」ルールは、フィールドを要求された幅にパディングすることを排除しませんが、私が知る限り、接頭辞付きのスペースまたは+
は変換の一部であるため、「文字なし」ルールの対象となります。
この問題はこれまでに解明されたことがありますか?
c++ - && と & と bool の違いはありますか?
C++ では、 bool(s) 間&&
で (論理) と(ビット単位) の実行に違いはありますか?&
case1
とは同じですか、case2
そうでない場合、それらはどの程度正確に異なりますか? ビットごとのブール値は移植可能ですか?
c++ - 単一の仮想継承では、恐ろしいダイヤモンドの問題を解決できないのはなぜですか?
上記のコーディングを行っても、コンパイラは次のD2
ことも要求しますvirtual
。
私が理解していないのは、(経由で)コンパイラB
にプロンプトを表示virtual
した後、なぜそれがまだ曖昧なのかということです。DD
D1
i
(私の記憶が正しければ、古いVC++(2006年)は、単一virtual
継承だけでこれを理解するのに十分な能力がありました)
c - strtol などの仕様における紛らわしい言語
の仕様でstrtol
は、入力文字列を「最初の空白」、「サブジェクト シーケンス」、および「最終文字列」に概念的に分割し、「サブジェクト シーケンス」を次のように定義しています。
入力文字列の最長の最初のサブシーケンスで、予期される形式の最初の非空白文字で始まります。入力文字列が空であるか、完全に空白文字で構成されている場合、または最初の非空白文字が記号または許容される文字または数字以外である場合、サブジェクト シーケンスには文字が含まれません。
かつて、「最長の最初のサブシーケンス」ビジネスは、失敗した一致としてスキャンし、次の未読文字としてスキャンする方法に似てscanf
いると考えていました。ただし、いくつかの議論の後、予想される形式の可能な文字列の最初の部分シーケンスである最長の初期文字列ではなく、予想される形式である最長の最初の部分シーケンスを処理することがほぼ確信しています。"0x@"
"0x"
"@"
strtol
まだ私を混乱させているのは、仕様の次の言語です。
サブジェクト シーケンスが空であるか、期待される形式を持たない場合、変換は実行されません。endptr が NULL ポインターでない場合、str の値は endptr が指すオブジェクトに格納されます。
「サブジェクト シーケンス」の正しい定義であると思われるものを受け入れる場合、期待される形式を持たない空でないサブジェクト シーケンスなどは存在せず、代わりに (冗長性と混乱を避けるために) テキストは単に読む必要があります。 :
サブジェクト シーケンスが空の場合、変換は実行されません。endptr が NULL ポインターでない場合、str の値は endptr が指すオブジェクトに格納されます。
誰かが私のためにこれらの問題を明確にすることができますか? おそらく、過去の議論や関連する欠陥レポートへのリンクが役立つでしょう。
c++ - トラップ表現
Cの「トラップ表現」とは何ですか(いくつかの例が役立つ場合があります)?これはC++に適用されますか?
このコードを考えると...
...そして、、同じバイナリ表現/パターンを持っていると仮定し
sizeof(int) == sizeof(float)
ますか?f
*pi
c++ - c++0x で nullptr を削除しても安全ですか?
ヌルポインタを削除しても効果がないことはc++03
明らかです。実際、それは次のように明示的に述べられ§5.3.5/2
ています。
いずれの場合も、delete のオペランドの値がヌル ポインターの場合、操作は無効になります。
ただし、現在のドラフトでは、c++0x
この文が欠落しているようです。ドラフトの残りの部分では、 delete-expressionのオペランドがnull ポインター定数でない場合に何が起こるかを述べている文章しか見つけることができませんでした。で定義されている null ポインタを削除していますc++0x
か? もしそうなら、どこで?
ノート:
それがまだ明確に定義されていることを示唆する重要な状況証拠があります。
まず、次の文が 2 つあります§5.3.5/2
。
最初の選択肢 (delete object) では、delete のオペランドの値がヌル ポインター値である可能性があります。
と
2 番目の選択肢 (delete array) では、delete のオペランドの値は null ポインター値または ...
これらは、オペランドがヌルであってもよいと言っていますが、それ自体では実際にヌルである場合に何が起こるかを定義していません。
第 2 に、 の意味を変更することdelete 0
は重大な破壊的変更であり、標準化委員会がこの特定の変更を行う可能性はほとんどありません。さらに、これが草案の互換性付属書 (付属書 C) の重大な変更であるという言及はありませんc++0x
。ただし、附属書 C は参考セクションであるため、規格の解釈には関係ありません。
一方、null ポインターを削除しても効果がないという事実は、追加の実行時チェックを意味します。多くのコードではオペランドを null にすることはできないため、このランタイム チェックはゼロ オーバーヘッドの原則と矛盾します。おそらく、委員会は、言語の規定された設計目標により標準の C++ を一致させるために動作を変更することを決定したのでしょう。
c++ - 演算子newが引数を「constsize_t」として強制されないのはなぜですか?
以下のものはどこにも使用していませんが、それでもこの質問は長い間私の頭の中にありました。
上記がオーバーロードの明確に定義された動作ではない可能性があることを知っているのでnew
(たとえば、size
が減少した場合)、なぜ標準でコンパイラにそれを強制しないのvoid* operator new (const size_t);
ですか?
同じことがoperator delete
、必要な場所でも議論できます(ポインタが変更されないようにvoid operator delete (void* const);
追加します)。const