問題タブ [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++ - 名前空間 std を使用する順序。含まれていますか?
最近、C++ プロジェクトのソース ファイルで次のコードが使用されているのを見ました。
持っているのが良い考えかどうかという問題をすべて無視してusing namespace std
、上記のコードは合法ですか? この 2 行より前のコードはファイルにありません。
ディレクティブがファイルに含めるnamespace std
までスコープで宣言されていないため、これはコンパイルされないと思っていましたが、プロジェクトのビルドシステムを使用すると、これは問題なくコンパイルされました。#include <iostream>
誰かが仕様の関連部分へのリンクを持っている場合は、それが最も高く評価されます.
c++ - 純粋仮想デストラクタの目的は何ですか?
重複の可能性:
純粋仮想関数の実装を提供することは、どのような状況で有利ですか?
C++ で純粋な仮想デストラクタが必要なのはなぜですか?
純粋なデストラクタがChild class
ある場合、コンパイラはデストラクタの実装を強制しません。Base
virtual
面白い部分はそれです。コンパイラはむしろBase
、デストラクタ本体を定義するように強制します。これは理解されています。(参考までにデモ)
それでは、クラスに純粋なデストラクタを持つ目的は何ですか? (オブジェクトの作成を禁止するだけですか?)virtual
Base
Base
c++ - C++11 で「enum クラス」は本当に必要ですか?
私たちが持っているとき、
では、なぜ必要なのか、
IMO 2nd バージョンは、1st よりも多くの機能を提供していません。enum class
2 つの中かっこを節約するためだけに導入されたとは思いません{};
。重要な側面がありませんか?
マイナーな質問として、構文以外にenum class
との間に違いはありますか(どちらにもアクセス指定子があるため) ?enum struct
public
c - pが不完全な型へのポインタであるとすると、&* pは有効なCですか?
次の例は、Cの有効な完全な翻訳単位ですか?
struct foo
は不完全な型ですが、C標準で不完全な型を間接参照することの明示的な禁止を見つけることができません。特に、§6.5.3.2は次のように述べています。
単項
&
演算子は、そのオペランドのアドレスを生成します。オペランドの型が「type」の場合、結果の型は「pointertotype」になります。オペランドが単項演算子の結果である場合、*
その演算子も演算子も&
評価されず、演算子の制約が引き続き適用され、結果が左辺値ではないことを除いて、結果は両方が省略されたかのようになります。
結果が左辺値ではないという事実は密接な関係はありません-戻り値はそうである必要はありません。*
演算子の制約は単純です。
単項*演算子のオペランドは、ポインター型でなければなりません。
および&
演算子は次のとおりです。
単項演算子のオペランドは
&
、関数指定子、単項演算子[]
または単項演算子の結果、または*
ビットフィールドではなくregister
ストレージクラス指定子で宣言されていないオブジェクトを指定する左辺値のいずれかでなければなりません。
ここでは両方とも簡単に満たされるので、結果はちょうど。と同等になるはずですreturn j;
。
ただし、gcc4.4.5はこのコードをコンパイルしません。代わりに、次のエラーが発生します。
これはgccの欠陥ですか?
actionscript-3 - Actionscript 3の整数乗算mod 2³²
Actionscript 3 で int と uint の演算がどのように機能するかについて、正式な仕様に出くわした人はいますか? (「信頼できる」とは、「Adobe から提供された」または「Adobe によって信頼できると宣言されている」ことを意味します)。特に、2 32を法とする整数乗算を行うサポートされている方法を探しています。これは、私が見つけた Adobe ドキュメントではカバーされていません。
Actionscript は ECMAScript に基づいていると主張していますが、ECMAScript は整数演算をまったく行いません。IEEE-754 double ですべてを実行し、ビット単位の演算の前に結果を法 2 32に減らします。これにより、ほとんどの場合、整数演算がシミュレートされます。ただし、これは乗算には機能しません。乗算の真の結果、たとえば 0x10000001 * 0x0FFFFFFF は double の仮数には長すぎるため、指定が文字どおりに行われると下位ビットが失われます。
ここで、Actionscript を入力します。2 つのor変数を乗算し、積をorにすぐにキャストすると、常に正確な結果が得られるように思われることが実験的にわかりました。ただし、生成された AVM2 バイトコードには、単純な「mul」命令が含まれているだけで、浮動小数点ではなく整数の結果を生成することになっていることを直接示すものはありません。仮想マシンは、これを見つけるために先を見なければなりません。実験で運が良かっただけで、信頼できるものではなくボーナスとして余分な精度を得たのではないかと心配しています.int
uint
int
uint
(1 つには、私の実験はすべて x86 Flash プレーヤーを使用して実行されました。おそらく、それは中間結果を Intel 80 ビット double として表すか、またはそれが何に使用されるかがわかるまで評価スタックに 64 ビット int を格納します。どちらもネイティブの 32×32→64 乗算命令がない非 x86 タブレットで簡単に可能になるため、VM は ECMAScript 標準で指定されている精度まで下げることを決定する可能性がありますか?)
24 時間の状況: Mike Welsh は適切な調査を行い、非常に役立つリンクを提供しましたが、残念ながら質問を閉じるには不十分です。他の誰か?
(tl;dr コメントでの討論: whitequark は、答えが「いいえ」である可能性がある私の仮説的な理由の 1 つにある程度反論します。彼の指摘にはメリットがありますが、もちろん答えが「はい」であることを示すものではありません。 )。
c++ - あいまいな挿入されたクラス名はエラーではありません
挿入されたクラス名についてC++標準で読んだことは、(私が見ているように)サンプルプログラムの動作と矛盾しています。これが私が読んだものです:
3.4から(パラグラフ3)
クラスの注入されたクラス名(第9節)も、名前の非表示と検索の目的で、そのクラスのメンバーであると見なされます。
9から(段落2)
クラス名は、クラス名が表示された直後に宣言されているスコープに挿入されます。クラス名は、クラス自体のスコープにも挿入されます。これは、注入されたクラス名として知られています。アクセスチェックの目的で、注入されたクラス名は、パブリックメンバー名であるかのように扱われます。
これらのことから、以下は整形式の翻訳単位であり、正常にコンパイルされることがわかります。
ただし、次の場合はエラーが発生するはずですが、そうではありません。
名前は両方にvector
挿入され、パブリックメンバー名のように挿入されるため、Xに継承される必要があります。したがって、の名前はあいまいである必要があります。私は何かが足りないのですか?std::vector<int>
std::vector<char>
vector
X
PS私はMSVC9.0を使用しています
c++ - C++ - 'const' 修飾子を使用して静的メンバー関数を作成できない理由
今日は問題が発生しました。私はstatic
メンバー関数が必要ですが、必須でconst
はありませんが、より良いです。しかし、私は自分の努力に成功しませんでした。なぜ、またはどのように言うことができますか?
c++ - int a[] = {1,2,}; 初期化リストの末尾のコンマが許可されるのはなぜですか?
私はこの惑星の出身ではないかもしれませんが、以下は構文エラーであるように思われます。
しかし、そうではありません。このコードを Visual Studio でコンパイルしたときは驚きましたが、C++ の規則に関する限り、MSVC コンパイラを信頼しないことを学んだので、標準を確認したところ、標準でも許可されています。信じられないなら、文法規則については 8.5.1 を参照してください。
なぜこれが許可されているのですか?これはばかげた役に立たない質問かもしれませんが、私が尋ねている理由を理解していただきたいです。それが一般的な文法規則のサブケースである場合、私は理解するでしょう-初期化子リストの最後にある冗長なコンマを許可しないためだけに、一般的な文法をこれ以上難しくしないことに決めました。いいえ、追加のコンマは明示的に許可されています。たとえば、関数呼び出しの引数リストの末尾に冗長なコンマを含めることは許可されていません (関数が を受け取る場合...
) 。これは通常のです。
繰り返しになりますが、この冗長なコンマが明示的に許可されている特定の理由はありますか?
c++ - 重複した例外仕様を定義することは合法ですか?
上記のコードをg++4.4.3でエラーなしでコンパイルしました。ただし、これが標準に基づく正当な構文であるかどうかはわかりません。
c++ - プログラム状態の変化は観察可能な動作を構成しますか?
次の 2 つのプログラムを検討してください。
プログラム 1
プログラム 2
彼らは同じ観察可能な行動を持っていますか?C++ 標準 (1.9/6) によると、観察可能な動作には以下が含まれます。
volatile
データの読み取りと書き込み- ライブラリ I/O 関数
srand()
とrand()
はおそらく I/O 関数ではありませんが (特定の実装が何らかのハードウェア ノイズ ソースを使用しているかどうかはわかりませんが)、プログラムの内部状態を変更します。彼らはデータを操作しvolatile
ますか? 知らない。への呼び出しprintf()
は明らかに I/O 操作であり、そのシーケンスは両方のプログラムで同じです。
上記の 2 つのプログラムの動作は同じですか? 特定の 2 つのプログラムが同じ観察可能な動作をしているかどうかを知るにはどうすればよいですか?