1. ホーム
  2. c++

[解決済み】C++のコードはC++03とC++11の両方で有効ですが、異なることを行うことができますか?

2022-04-19 01:37:12

質問

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";
}