問題タブ [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++ - 'new'を割り当てたときに仮想関数を実装解除できないのはなぜですか?
スタック上のオブジェクトの場合、正常に機能します。new
ただし、 (ではなく)を使用したヒープへの割り当てでmalloc
は、リンカーエラーが発生します。
c++ - 静的記憶域期間を持つオブジェクト内の初期化されていないポインターは、NULL またはすべてゼロに初期化されていますか?
好奇心と、現在手元に標準のコピーがないためです。
null ポインターがすべてゼロのパターンで表されない実装が与えられた場合、静的ストレージ期間を持つオブジェクトの初期化されていないポインター メンバーは、適切な null ポインター値またはすべてゼロの値に初期化されますか?
標準化が少なく、コードが多い:
0x00000001 の NULL ポインター表現が与えられた場合、 main()の先頭にある fp のビットごとの表現には何が期待できますか?
c++ - returnステートメントが存在しないのになぜコンパイラエラーがないのですか?
Javaとは異なり、C /C++では次のことが許可されています。
これにより、クラッシュが発生し、デバッグが困難になることがよくあります。なぜ標準は非関数の最終的なリターンを強制しないのですか?void
(コンパイラは間違ったreturn
値に対してエラーを生成します)
これを強制するためのフラグがgcc/msvcにありますか?(のようなもの-Wunused-result
)
c++ - string::stringの最後に挿入
次の2行は、VisualStudio2005でも同じことを行います。
と
最初のものはout_of_range例外をスローすることになっていますか、それともこれは正しい動作ですか?
c - 多次元配列への 1 次元アクセス: 明確に定義された動作ですか?
1 次元の方法で最初の要素へのポインター (おそらくオフセット) を逆参照することによって、真の多次元配列にアクセスすることは慣用的な C と見なされることに、私たちは皆同意していると思います。
ただし、私の言語弁護士は、これが実際に明確に定義された C であると納得させる必要があります。特に:
mtx[0][2]
標準は、コンパイラが間にパディングを入れないことを保証していますmtx[1][0]
か?通常、配列の末尾からのインデックス付け (末尾の 1 つ後ろ以外) は定義されていません (C99、6.5.6/8)。したがって、以下は明らかに未定義です。
したがって、同じ規則により、次のものが未定義であることが予想されます。
では、なぜこれを定義する必要があるのでしょうか。
/li>
では、C 標準のどの部分でこれが明示的に許可されているのでしょうか? (議論のためにc99と仮定しましょう。)
編集
これがすべてのコンパイラで正常に機能することは間違いありません。私が質問しているのは、これが標準で明示的に許可されているかどうかです。
c++ - なぜないのですかヘッダーが存在しないことは欠陥と見なすことができますか?
標準ライブラリには、<iosfwd>
を含むすべてのストリームを (前方に) 宣言し、特殊化を含むテンプレートtypedef
を定義するヘッダーが含まれています。char_traits
悲しいことに、、、、など<stlfwd>
のすべての一般的な STL データ型と関数を (前方に) 宣言するようなヘッダーはあり ません。vector
map
less
sort
typedef
std
§17.4.3.1 [lib.reserved.names] p1
:
特に指定がない限り、C++ プログラムが名前空間または名前空間内の名前空間に宣言または定義を追加することは定義されていません。プログラムは、標準ライブラリ テンプレートのテンプレートの特殊化を namespace に追加できます。
std
std
std
そうです、型が標準ライブラリに既に存在する場合でも、(前方) 宣言の場合をカバーします。もちろん、ほとんどの (すべての?) コンパイラーは、そのような宣言を追加しても完全に正常に動作しますが、厳密に言えば、言語弁護士の話では、未定義の動作です。typedef
これは、次のような標準コンテナでは特に面倒です。
さて、これは欠陥と見なすことができますか?
私は、<stlfwd>
ヘッダーが存在しないこと (または、より適切には<stdfwd>
、カバー<iosfwd>
も) と、標準ライブラリーに既に存在する宣言の禁止の両方を意味します。
また、この質問によれば、標準コンテナ、アルゴリズム、およびファンクタ/機能を標準で要求されているとおりに(前方に)宣言すると、コードは完全に有効になるはずです(これはstd
、実装が非表示/デフォルトのテンプレート パラメータを追加することを許可されていないためです。
最終的にはこれに関する不具合報告を提出しようと考えているので、この質問をしています。
c++ - C ++ 11では、標準化されたメモリモデルが導入されました。どういう意味ですか?そして、それはC ++プログラミングにどのように影響しますか?
C ++ 11は標準化されたメモリモデルを導入しましたが、それは正確にはどういう意味ですか?そして、それはC ++プログラミングにどのように影響しますか?
この記事(ハーブサッターを引用しているGavin Clarkeによる)は、次のように述べています。
メモリモデルは、C ++コードに、誰がコンパイラを作成し、どのプラットフォームでコンパイラを実行しているかに関係なく呼び出す標準化されたライブラリがあることを意味します。さまざまなスレッドがプロセッサのメモリと通信する方法を制御する標準的な方法があります。
「標準に含まれるさまざまなコア間で[コード]を分割することについて話しているときは、メモリモデルについて話している。人々がコードで行う次の仮定を破ることなく、それを最適化する」とサッター氏は述べた。
ええと、私はオンラインで利用できるこの段落と同様の段落を覚えることができ(私は生まれてから自分の記憶モデルを持っていたので:P)、他の人からの質問への回答として投稿することもできますが、正直なところ、私は正確には理解していませんこれ。
C ++プログラマーは以前からマルチスレッドアプリケーションを開発していましたが、それがPOSIXスレッド、Windowsスレッド、またはC ++ 11スレッドであるかどうかはどのように重要ですか?メリットは何ですか?低レベルの詳細を理解したい。
また、C ++ 11メモリモデルは、C ++ 11マルチスレッドのサポートに何らかの形で関連していると感じます。これは、これら2つを一緒に見ることがよくあるためです。もしそうなら、どのくらい正確に?なぜそれらは関連している必要がありますか?
マルチスレッドの内部がどのように機能するのか、そしてメモリモデルが一般的に何を意味するのかわからないので、これらの概念を理解するのを手伝ってください。:-)
c++ - 複数の名前空間を一気に開くことが禁止されているのはなぜですか?
それは可能ですusing namespace foo::bar;
(つまり、最初に外側の名前空間を使用せずに内側の名前空間を使用する/まったく)、なぜ標準は次のことを禁止するのですか?
私は回避策を探しているのではなく、これが許可されていない理由について考えられる合理的な理由を探しているだけです。
c++ - 「名前空間 X を使用している」のはなぜですか。クラス/構造体レベルでは許可されていませんか?
その背後にある動機を知りたい。
c# - C# には private キーワードが必要ですか?
(このコメントに触発されました)
キーワードを使用する必要がある状況はありますか?
(つまり、キーワードを省略すると別の動作になる状況)private