問題タブ [c++03]
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++ - c++03: std::map の組み込み型のデフォルト コンストラクター
私はいつも次のコードだと思っていました
マップ内で単位化された値が作成されるため、ランダムな値が出力されます。ただし、作成された int は実際には常にゼロに初期化され、標準の組み込み型も特定の状況でゼロに初期化されることが判明しました。
問題は、標準型 (int/char/float/double/size_t) のゼロ初期化がいつ実行されるかです。int i;
どこかで宣言すると、ランダムなデータが含まれることは間違いありません。
PS 質問は C++03 標準に関するものです。質問の理由は、int/float/size_t などの組み込み型の初期化をいつ提供する必要があるか、またはいつ安全に省略できるかがわからなくなったためです。
c++ - std :: string :: operator []の結果のアドレスは、書き込み可能なヌル終了バッファを指していますか?
const char *を受け入れ、関数ProcessStringを使用する関数を変更しています。ProcessStringは、nullで終了する文字バッファーをchar*として予期する関数です。以下の関数シグネチャで定義されているように、バッファ内の文字は変更される場合と変更されない場合があります。「ギャップを埋める」ために、一時的なstd :: string:を使用しています。
私の主な質問は、std :: string :: operator []の保証と、上記の&temp[0]によって返されるアドレスがchar*として使用可能なnullで終了するバッファーであるかどうかについてです。第二に、そして非常に第二に、これを行うためのより良い方法はありますか?
私はC++03を使用しています。
c++ - プロキシ オブジェクトで mem_fun_ref を使用する
std::mem_fun_ref
プロキシを介してメンバー関数を呼び出すために (はい、廃止されたバージョン。理由は以下) を使用しようとしています。
std::mem_fn
これは C++11ではうまく機能しboost::mem_fn
ますが、boost::mem_fn
. 使用できれば問題ありませんがdecltype
、コードが C++03 と互換性がある必要があるため使用できません。
これを回避する最も簡単な方法は何ですか? カスタム
mem_fun_through_proxy
?
編集:もう1つの注意点は、proxy
クラスを変更できないことです。
c++ - C++03でオーバーライドを定義することは合法ですか
多くのC++11機能を使用しているプロジェクトがあり、C++03でコンパイルするためにこのトリックについて考えました。
私の知る限り、C ++キーワードを定義することは禁じられていますが、これは合法ですか?
c++ - 基本クラスにキャストされたアイテムのインスタンスへのshared_pointersのリストを持つアイテムを別のリストにソートするためのキャストオプションは何ですか?
基本クラスgreen
とそのような階層ツリーがあるとします:
のように見えるすべてのクラスなどでgreenList
満たされたリストがあります。このリストは、データが入っているので作成しません。などのクラスのリストを作成します。etc クラスのヘッダーはありますが、クラス内には入れたくありません。red
blue
green
red
yellow
red
getType
green
そのリストをC ++ 03で(ブーストを使用して)などのリストgreenList
にソートする方法は?redList
yellowList
c++ - ここで呼び出されるコンストラクターはどれですか?
このコードフラグメントでは、実際にどのコンストラクターが呼び出されますか?
ベクターには、コピーコンストラクター、デフォルトコンストラクター、および代入演算子があります。
getVectorは値で戻ります。
コードはC++03標準を使用します。
コードフラグメントは、デフォルトコンストラクターを呼び出してから代入演算子を呼び出すことになっているように見えますが、この宣言はコピーコンストラクターを使用する別の形式であると思われます。どちらが正しい?
c++ - new obj() を作成するときに基本クラス コンストラクタ new base(argT argV) を呼び出す方法は?
だから私はbase
コンストラクターを持つクラスを持っています(T V)
. 次のようなものを作成したいobj
コンストラクターを持つクラスを継承しました()
T val;
しかし、C++ でobj ベース コンストラクター値に渡す方法は?
c++ - C++03 と C++11 の両方をサポートするために nullptr を定義する方法は?
nullptr
C++03 と C++11 の両方をサポートするための定義方法は?
以下のコードは、C++11 コンパイラの nullptr の意味を変更せずに、C++03 と C++11 の両方のコンパイルでコンパイルされますか?
c++ - 「ブレーク」を使用すると、BOOST_FOREACH は無限ループに入りますか?
次のコード セグメントは、
BOOST_FOREACH
ステートメント内で無限ループに入りますが、その理由がわかりません。Boost のドキュメントからわかる限り、BOOST_FOREACH
ループ内で「break」を使用しても問題ありません。ここで何がうまくいかないのでしょうか?
BOOST_FOREACH
ループを for ループ (イテレータ from sectors.begin()
to を使用)に置き換えると、sectors.end()
問題なく動作します (無限ループはありません)。
バージョンと追加情報:
- ブースト: 1.40.0
- gcc: 4.1.2
- アーキテクチャ: x86_64
- この動作はリリース ビルドでのみ発生します。デバッグ ビルドを実行すると、期待どおりに動作します。
- Visual Studio でコンパイルすると、期待どおりに動作します。つまり、無限ループはありません。
mkb の質問に答えて、実行すると次のようになりますgcc -E
。
この展開の注目すべき機能の 1 つは、ネストされた 2 つの for ループがあることです。内側のループと外側のループで何が起こっているのかを理解することはできませんが、(Davidが示唆しているように)内側のループだけから抜け出し、BOOST_FOREACHが一部の人にとってそれを適切に処理していない可能性はありますか理由?
c++ - C++ 標準のどのバージョンで "(i+=10)+=10" が未定義の動作をしますか?
C++ では、次の動作は未定義ですか。
What's the result of += in C and C++?への私の回答に対するコメントで、これについていくつかの議論がありました。ここでの微妙な点は、デフォルトの応答が「はい」のように見えるのに対し、正しい答えは「C++ 標準のバージョンに依存する」であるように見えることです。
標準のバージョンに依存する場合は、どこが UB でどこがそうでないかを説明してください。