[解決済み】C++のコードはC++03とC++11の両方で有効ですが、異なることを行うことができますか?
質問
C++のコードで、以下の両方に準拠することは可能でしょうか? C++03 規格と C++11 というのは、どの規格でコンパイルされているかによって、異なる動作をするのでしょうか?
どのように解決するのですか?
答えは間違いなくイエスです。プラス面では、あります。
- これまで暗黙のうちにオブジェクトをコピーしていたコードは、可能な限り暗黙のうちにオブジェクトを移動するようになりました。
ネガティブな面では、規格の付録Cにいくつかの例が挙げられています。ポジティブなものよりもネガティブなものの方が多いとはいえ、それぞれ発生する可能性はかなり低くなっています。
文字列リテラル
#define u8 "abc"
const char* s = u8"def"; // Previously "abcdef", now "def"
そして
#define _x "there"
"hello "_x // Previously "hello there", now a user defined string literal
0の型変換
C++11では、リテラルのみが整数のヌルポインタ定数です。
void f(void *); // #1
void f(...); // #2
template<int N> void g() {
f(0*N); // Calls #2; used to call #1
}
整数の除算・モジュロ後の丸め結果
C++03では、コンパイラーは0方向に丸めるか、負の無限大に丸めるかのどちらかを選択できました。C++11では、0に向けて丸めることが必須です。
int i = (-1) / 2; // Might have been -1 in C++03, is now ensured to be 0
ネストされたテンプレート閉じ中括弧の間の空白文字 >> と > >
特殊化またはインスタンス化の内部では
>>
は、C++03 では右シフトとして解釈される可能性があります。しかし、これは既存のコードを破壊する可能性が高いです。
http://gustedt.wordpress.com/2013/12/15/a-disimprovement-observed-from-the-outside-right-angle-brackets/
)
template< unsigned len > unsigned int fun(unsigned int x);
typedef unsigned int (*fun_t)(unsigned int);
template< fun_t f > unsigned int fon(unsigned int x);
void total(void) {
// fon<fun<9> >(1) >> 2 in both standards
unsigned int A = fon< fun< 9 > >(1) >>(2);
// fon<fun<4> >(2) in C++03
// Compile time error in C++11
unsigned int B = fon< fun< 9 >>(1) > >(2);
}
オペレーター
new
以外の例外を投げることができるようになりました。
std::bad_alloc
struct foo { void *operator new(size_t x){ throw std::exception(); } }
try {
foo *f = new foo();
} catch (std::bad_alloc &) {
// c++03 code
} catch (std::exception &) {
// c++11 code
}
ユーザが宣言したデストラクタは暗黙の例外指定がある の例 C++11で導入された破壊的な変更点は?
struct A {
~A() { throw "foo"; } // Calls std::terminate in C++11
};
//...
try {
A a;
} catch(...) {
// C++03 will catch the exception
}
size()
のコンテナをO(1)で実行する必要があるようになりました。
std::list<double> list;
// ...
size_t s = list.size(); // Might be an O(n) operation in C++03
std::ios_base::failure
から直接派生するものではありません。
std::exception
もう
ダイレクトベースクラスが新しいのに。
std::runtime_error
はそうではありません。したがって
try {
std::cin >> variable; // exceptions enabled, and error here
} catch(std::runtime_error &) {
std::cerr << "C++11\n";
} catch(std::ios_base::failure &) {
std::cerr << "Pre-C++11\n";
}
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] C言語とC++の両方で有効なコードを、それぞれの言語でコンパイルすると、異なる動作になることがありますか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++