問題タブ [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.

0 投票する
1 に答える
1410 参照

c++ - 別のクラスと同じ名前のクラス静的メソッドを持つ

例は次のとおりです。

コンパイラエラーは次のとおりです。

Fedora 9 で gcc 4.3.0 を使用しています。

誰かがコンパイラが不平を言っている理由を説明できますか? 可能であれば、標準からの参照とともに。

ありがとう

0 投票する
5 に答える
435 参照

c++ - 純粋でない場合、仮想メンバー関数が使用されますか?

C++03 3.2.2 ...その名前が潜在的に評価される式に現れる場合、オブジェクトまたはオーバーロードされていない関数が使用されます。純粋でない場合は、仮想メンバー関数が使用されます...

すべてのプログラムに3.2.3、そのプログラムで使用されるすべての非インライン関数またはオブジェクトの定義が 1 つだけ含まれている必要があります。診断は必要ありません。定義は、プログラム内で明示的に表示されるか、標準またはユーザー定義ライブラリーで見つけることができます。または (適切な場合) 暗黙的に定義されます (12.1、12.4、および 12.8 を参照)。インライン関数は、それが使用されるすべての翻訳単位で定義されます。

私が読んでいる行に沿って:純粋な仮想関数は使用されていません。ODR は、使用される機能にのみ適用されます。これは、次のことが合法であることを意味しませんか? 答えはノーだと思いますが、そうではありませんが、その理由はわかりません。

0 投票する
5 に答える
5877 参照

c++ - 純粋仮想関数にはインライン定義がない場合があります。なんで?

純粋仮想関数は、仮想であり、純粋指定子( = 0;)を持つメンバー関数です。

C++03 の10.4 節のパラグラフ 2は、抽象クラスとは何かを示しており、補足として、次のことを示しています。

[注: 関数宣言は、pure-specifier と定義の両方を提供することはできません — 終わりの注] [例:

—終わりの例]

この問題にあまり詳しくない人のために、純粋仮想関数は定義を持つことができますが、上記の節はそのような定義がインライン (字句的にはクラス内) に現れることを禁止していることに注意してください。(純粋仮想関数の定義の使用については、たとえば、この GotWが表示される場合があります)

現在、他のすべての種類およびタイプの関数に対して、クラス内定義を提供することが許可されています。この制限は、一見、完全に人為的で説明がつかないように見えます。考えてみれば、2回目以降はそう見えますが(笑)でも、特に理由が無ければ制限は無いと思います。

私の質問は、これらの特定の理由を知っている人はいますか? 良い推測も大歓迎です。

ノート:

  • MSVC では、PVF にインライン定義を含めることができます。だから驚かないでください:)
  • この質問の単語は、インラインキーワードinlineを参照していません。語彙的にクラス内を意味するはずです
0 投票する
5 に答える
745 参照

c - 非プロトタイプ関数宣言のこの疑わしい使用は有効ですか?

これは有効なC(C99)コードですか?

明らかに、プログラムは、負の引数で呼び出されて1つの引数を取る関数ではない場合、または負でない引数で呼び出されて2つの引数を取る関数ではない場合、未定義gf動作intgfますint。それ以外の場合?

g例として、上記から呼び出してf以下を提供するこの別個のソースファイルを考えてみましょう。

0 投票する
2 に答える
1066 参照

c++ - 異なるシグネチャで関数を定義する

今日、私は、1つの署名を使用してヘッダーで関数を宣言し、それを別の(類似した)署名を使用してソースファイルに実装できることを発見しました。たとえば、次のようになります。

これは許可されていますか?それとも、これはコンパイラの拡張機能ですか(私はg ++ 4.3.0を使用しています)?

編集 私は衒学的で可能な最大の警告レベルでコンパイルしていますが、それでも警告やエラーは発生しません。

0 投票する
2 に答える
3780 参照

c++ - std::map の型要件

今日、値の型にデフォルトのコンストラクターがないマップを作成しました。operator[] を使用して要素をこのマップに挿入できないことに驚きましたが、insert メソッドを使用する必要がありました。

では、std::map のキーと値の型の要件は正確には何でしょうか?

ここに短い例があります:

私はこのようにコンパイルしています:

0 投票する
3 に答える
391 参照

c++ - C ++標準の未定義動作段落の[注]はどういう意味ですか?

ユーザーTonyが 指摘しているように、C++標準の1.3.12項に[注]があります。

許容される未定義の動作は、予測できない結果を伴う状況を完全に無視することから、環境に特徴的な文書化された方法での翻訳またはプログラムの実行中の動作にまで及びます。

これは、UBの定義と矛盾しませんか...この国際規格は要件を課していませんか?つまり、同じ段落で「要件なし」と言ってから「許容UB」と言うのです。

このメモはどのように解釈されるべきですか?それは確かにUBを何らかの形で制限しますか?

0 投票する
1 に答える
2895 参照

c++ - 基本クラスを参照するときに名前空間が必要ですか

私はこのようなコードを持っています:

Derivedがその基本クラスを参照する名前空間修飾子が必要ですか?GCCとMSVCは記述されたコードに満足していますが、名前空間を入れない限り、別のコンパイラが文句を言います。C++標準は何と言っていますか?

0 投票する
7 に答える
4695 参照

c++ - 初期化されていないポインタの逆参照が未定義の動作であるとC++標準は正確にどこで言っていますか?

これまでのところ、次のように推測する方法が見つかりません。

未定義の動作です。

まず、5.3.1/1 には、*に変換T*されるindirection を意味することが記載されていTます。しかし、これはUBについては何も言いません。

次に、3.7.3.2/4 がよく引用され、null 以外のポインターで割り当て解除関数を使用するとポインターが無効になり、その後の無効なポインターの使用は UB であると述べられています。しかし、上記のコードでは、割り当て解除については何もありません。

上記のコードで UB をどのように推定できますか?

0 投票する
5 に答える
13651 参照

c++ - `long`は少なくとも32ビットであることが保証されていますか?

C ++標準を読んだことで、C++の基本的な基本型のサイズは次のようになっていることを常に理解していました。

私はこれを3.9.1/2から推測しました:

  1. 符号付き整数タイプには、「signed char」、「short int」、「int」、および「longint」の4つがあります。このリストでは、各タイプは、リスト内でその前にあるものと少なくとも同じ量のストレージを提供します。プレーンintは、実行環境のアーキテクチャによって提案される自然なサイズを持っています

さらに、のサイズはchar3.9.1/によって次のように記述されています。

  1. [...]実装の基本文字セットのメンバーを格納するのに十分な大きさ。

1.7 / 1は、これをより具体的な用語で定義しています。

  1. C++メモリモデルの基本的なストレージユニットはバイトです。バイトは、少なくとも基本実行文字セットのメンバーを含むのに十分な大きさであり、連続するビットシーケンスで構成され、その数は実装によって定義されます。

これは私を次の結論に導きます:

ここでsizeof、タイプが何バイトかを示します。さらに、1バイトに含まれるビット数は実装によって定義されます。私たちのほとんどはおそらく8ビットバイトの処理に慣れていますが、標準ではn1バイトにビットがあるとされています。


この投稿で、AlfP.Steinbachは次のように述べています。

longは(少なくとも)32ビットが保証されています。

これは、標準に準拠したC++の基本型のサイズを理解しているすべてのことに直面しています。通常、私は初心者が間違っているとしてこの声明を軽視しますが、これはアルフだったので、さらに調査する価値があると判断しました。

それで、あなたは何と言いますか?longは、標準で少なくとも32ビットであることが保証されていますか?その場合、この保証がどのように行われるかについて具体的に説明してください。見えないだけです。

  1. C ++標準では、C ++を知るには、C(1.2 / 1)1を知っている必要があると具体的に述べられています。

  2. longC ++標準では、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>れます: