問題タブ [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++ - 別のクラスと同じ名前のクラス静的メソッドを持つ
例は次のとおりです。
コンパイラエラーは次のとおりです。
Fedora 9 で gcc 4.3.0 を使用しています。
誰かがコンパイラが不平を言っている理由を説明できますか? 可能であれば、標準からの参照とともに。
ありがとう
c++ - 純粋でない場合、仮想メンバー関数が使用されますか?
C++03 3.2.2
...その名前が潜在的に評価される式に現れる場合、オブジェクトまたはオーバーロードされていない関数が使用されます。純粋でない場合は、仮想メンバー関数が使用されます...
すべてのプログラムに3.2.3
は、そのプログラムで使用されるすべての非インライン関数またはオブジェクトの定義が 1 つだけ含まれている必要があります。診断は必要ありません。定義は、プログラム内で明示的に表示されるか、標準またはユーザー定義ライブラリーで見つけることができます。または (適切な場合) 暗黙的に定義されます (12.1、12.4、および 12.8 を参照)。インライン関数は、それが使用されるすべての翻訳単位で定義されます。
私が読んでいる行に沿って:純粋な仮想関数は使用されていません。ODR は、使用される機能にのみ適用されます。これは、次のことが合法であることを意味しませんか? 答えはノーだと思いますが、そうではありませんが、その理由はわかりません。
c++ - 純粋仮想関数にはインライン定義がない場合があります。なんで?
純粋仮想関数は、仮想であり、純粋指定子( = 0;
)を持つメンバー関数です。
C++03 の10.4 節のパラグラフ 2は、抽象クラスとは何かを示しており、補足として、次のことを示しています。
[注: 関数宣言は、pure-specifier と定義の両方を提供することはできません — 終わりの注] [例:
—終わりの例]
この問題にあまり詳しくない人のために、純粋仮想関数は定義を持つことができますが、上記の節はそのような定義がインライン (字句的にはクラス内) に現れることを禁止していることに注意してください。(純粋仮想関数の定義の使用については、たとえば、この GotWが表示される場合があります)
現在、他のすべての種類およびタイプの関数に対して、クラス内定義を提供することが許可されています。この制限は、一見、完全に人為的で説明がつかないように見えます。考えてみれば、2回目以降はそう見えますが(笑)でも、特に理由が無ければ制限は無いと思います。
私の質問は、これらの特定の理由を知っている人はいますか? 良い推測も大歓迎です。
ノート:
- MSVC では、PVF にインライン定義を含めることができます。だから驚かないでください:)
- この質問の単語は、インラインキーワード
inline
を参照していません。語彙的にクラス内を意味するはずです
c - 非プロトタイプ関数宣言のこの疑わしい使用は有効ですか?
これは有効なC(C99)コードですか?
明らかに、プログラムは、負の引数で呼び出されて1つの引数を取る関数ではない場合、または負でない引数で呼び出されて2つの引数を取る関数ではない場合、未定義g
のf
動作int
をg
しf
ますint
。それ以外の場合?
g
例として、上記から呼び出してf
以下を提供するこの別個のソースファイルを考えてみましょう。
c++ - 異なるシグネチャで関数を定義する
今日、私は、1つの署名を使用してヘッダーで関数を宣言し、それを別の(類似した)署名を使用してソースファイルに実装できることを発見しました。たとえば、次のようになります。
これは許可されていますか?それとも、これはコンパイラの拡張機能ですか(私はg ++ 4.3.0を使用しています)?
編集 私は衒学的で可能な最大の警告レベルでコンパイルしていますが、それでも警告やエラーは発生しません。
c++ - std::map の型要件
今日、値の型にデフォルトのコンストラクターがないマップを作成しました。operator[] を使用して要素をこのマップに挿入できないことに驚きましたが、insert メソッドを使用する必要がありました。
では、std::map のキーと値の型の要件は正確には何でしょうか?
ここに短い例があります:
私はこのようにコンパイルしています:
c++ - 基本クラスを参照するときに名前空間が必要ですか
私はこのようなコードを持っています:
Derivedがその基本クラスを参照する名前空間修飾子が必要ですか?GCCとMSVCは記述されたコードに満足していますが、名前空間を入れない限り、別のコンパイラが文句を言います。C++標準は何と言っていますか?
c++ - 初期化されていないポインタの逆参照が未定義の動作であるとC++標準は正確にどこで言っていますか?
これまでのところ、次のように推測する方法が見つかりません。
未定義の動作です。
まず、5.3.1/1 には、*
に変換T*
されるindirection を意味することが記載されていT
ます。しかし、これはUBについては何も言いません。
次に、3.7.3.2/4 がよく引用され、null 以外のポインターで割り当て解除関数を使用するとポインターが無効になり、その後の無効なポインターの使用は UB であると述べられています。しかし、上記のコードでは、割り当て解除については何もありません。
上記のコードで UB をどのように推定できますか?
c++ - `long`は少なくとも32ビットであることが保証されていますか?
C ++標準を読んだことで、C++の基本的な基本型のサイズは次のようになっていることを常に理解していました。
私はこれを3.9.1/2から推測しました:
- 符号付き整数タイプには、「signed char」、「short int」、「int」、および「longint」の4つがあります。このリストでは、各タイプは、リスト内でその前にあるものと少なくとも同じ量のストレージを提供します。プレーンintは、実行環境のアーキテクチャによって提案される自然なサイズを持っています
さらに、のサイズはchar
3.9.1/によって次のように記述されています。
- [...]実装の基本文字セットのメンバーを格納するのに十分な大きさ。
1.7 / 1は、これをより具体的な用語で定義しています。
- C++メモリモデルの基本的なストレージユニットはバイトです。バイトは、少なくとも基本実行文字セットのメンバーを含むのに十分な大きさであり、連続するビットシーケンスで構成され、その数は実装によって定義されます。
これは私を次の結論に導きます:
ここでsizeof
、タイプが何バイトかを示します。さらに、1バイトに含まれるビット数は実装によって定義されます。私たちのほとんどはおそらく8ビットバイトの処理に慣れていますが、標準ではn
1バイトにビットがあるとされています。
この投稿で、AlfP.Steinbachは次のように述べています。
longは(少なくとも)32ビットが保証されています。
これは、標準に準拠したC++の基本型のサイズを理解しているすべてのことに直面しています。通常、私は初心者が間違っているとしてこの声明を軽視しますが、これはアルフだったので、さらに調査する価値があると判断しました。
それで、あなたは何と言いますか?longは、標準で少なくとも32ビットであることが保証されていますか?その場合、この保証がどのように行われるかについて具体的に説明してください。見えないだけです。
C ++標準では、C ++を知るには、C(1.2 / 1)1を知っている必要があると具体的に述べられています。
long
C ++標準では、aが対応できる値の最小制限が-2になるようにLONG_MIN
暗黙的に定義されていますLONG_MAX
。
したがって、aがいくら大きくてlong
も、LONG_MINをLONG_MAXに保持するのに十分な大きさである必要があります。
しかし、Alfやその他の人は、longが少なくとも32ビットでなければならないことを明確にしています。これが私が確立しようとしていることです。C ++標準では、1バイトのビット数が指定されていないことが明示されています(4、8、16、42の場合もあります)。では、接続は、数値に対応できる状態からLONG_MIN-LONG_MAX
少なくとも32ビットになるまでどのように行われるのでしょうか。
(1)1.2 / 1:この文書の適用には、以下の参照文書が不可欠です。日付のある参照については、引用されたエディションのみが適用されます。日付のない参照については、参照されたドキュメントの最新版(修正を含む)が適用されます。
- ISO / IEC 2382(すべての部品)、情報技術–語彙
- ISO / IEC 9899:1999、プログラミング言語– C
- ISO / IEC 10646-1:2000、情報技術–国際符号化文字集合(UCS)–パート1:アーキテクチャと基本的な多言語平面
(2)次のように定義さ<climits>
れます: