C ++ 11ではどのような重大な変更が導入されていますか?

228
R. Martinho Fernandes 2011-06-19 13:48.

古いコードのコンパイルを停止させるC ++ 11の変更の少なくとも1つはexplicit operator bool()、標準ライブラリでの導入、の古いインスタンスの置き換えですoperator void*()。確かに、これが壊れるコードはおそらくそもそも有効であるべきではなかったコードですが、それでもなお壊れる変更です。以前は有効だったプログラムはもはやそうではありません。

他に重大な変更はありますか?

9 answers

178
Johannes Schaub - litb 2011-06-20 01:47.

FDISには、付録C.2「C ++およびISOC ++ 2003」に非互換性に関するセクションがあります。

要約すると、ここでFDISを言い換えると、SOの回答として(より適切に)適したものになります。違いを説明するために、私自身の例をいくつか追加しました。

ライブラリに関連する非互換性がいくつかあり、その意味が正確にわからないため、他の人に詳しく説明してもらいます。

コア言語


#define u8 "abc"
const char *s = u8"def"; // Previously "abcdef", now "def"

#define _x "there"
"hello"_x // now a user-defined-string-literal. Previously, expanded _x .

新しいキーワード:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexcept、nullptr、static_assert、thread_local


longで表すことができるよりも大きい特定の整数リテラルは、符号なし整数型から符号付きlonglongに変更される可能性があります。


整数除算を使用する有効なC ++ 2003コードは、結果を0または負の無限大に丸めますが、C ++ 0xは常に結果を0に丸めます。

(確かに、ほとんどの人にとって実際には互換性の問題ではありません)。


キーワードautoをストレージクラス指定子として使用する有効なC ++ 2003コードは、C ++ 0xでは無効である可能性があります。


変換を絞り込むと、C ++ 03との非互換性が発生します。たとえば、次のコードはC ++ 2003では有効ですが、doubleからintへの変換はナローイング変換であるため、この国際標準では無効です。

int x[] = { 2.0 };

暗黙的に宣言された特別なメンバー関数は、暗黙の定義が不正な形式であった場合に削除されたものとして定義されます。

定義が不要なコンテキスト(たとえば、評価されない可能性のある式)でこれらの特別なメンバー関数の1つを使用する有効なC ++ 2003プログラムは、形式が正しくありません。

私の例:

struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }

このようなsizeofトリックは、一部のSFINAEで使用されており、今すぐ変更する必要があります:)


ユーザーが宣言したデストラクタには、暗黙の例外仕様があります。

私の例:

struct A {
  ~A() { throw "foo"; }
};

int main() { try { A a; } catch(...) { } }

このコードはterminateC ++ 0xで呼び出しますが、C ++ 03では呼び出しません。A::~AC ++ 0xでの暗黙の例外仕様はnoexcept(true)です。


を含む有効なC ++ 2003宣言exportは、C ++ 0xでは不正な形式です。


>直後に別の式が続く有効なC ++ 2003式は、>2つのテンプレートを閉じるものとして扱われるようになりました。

C ++ 03では、>>常にシフト演算子トークンになります。


内部リンケージを持つ関数の依存呼び出しを許可します。

私の例:

static void f(int) { }
void f(long) { }

template<typename T>
void g(T t) { f(t); }

int main() { g(0); }

C ++ 03では、これはを呼び出しますf(long)が、C ++ 0xでは、これはを呼び出しますf(int)。C ++ 03とC ++ 0xの両方で、次の呼び出しに注意する必要がありますf(B)(インスタンス化コンテキストは、外部リンケージ宣言のみを考慮します)。

struct B { };
struct A : B { };

template<typename T>
void g(T t) { f(t); }

static void f(A) { }
void f(B) { }

int main() { A a; g(a); }

f(A)外部リンケージがないため、より適切なマッチングは行われません。


ライブラリの変更

C ++ 0xのC ++標準ライブラリに追加された識別子を使用する有効なC ++ 2003コードは、この国際標準でのコンパイルに失敗したり、異なる結果を生成したりする場合があります。


#includes新しいC ++ 0x標準ライブラリヘッダーの名前を持つヘッダーがこの国際標準では無効である可能性がある有効なC ++ 2003コード。


スワップが含まれることを期待してコンパイルされた有効なC ++ 2003コードには<algorithm>、代わりに含める必要がある場合があります<utility>


グローバル名前空間posixは、標準化のために予約されています。


有効なC ++定義があること2003コードoverridefinalcarries_dependency、またはnoreturnマクロなどのC ++ 0xのでは無効です。

28
arsenm 2011-06-19 14:00.

autoキーワードの意味が変わりました。

24
Downvoter 2011-06-19 13:54.

大きな変化?

ええと、一つdecltypeconstexprnullptr、識別子として、、などを使用した場合、問題が発生する可能性があります...

21
Johannes Schaub - litb 2011-06-20 02:42.

非互換性のセクションでカバーされていないいくつかのコアの非互換性:


C ++ 0xは、挿入されたクラス名を、名前がテンプレートテンプレートパラメーターへの引数として渡される場合はテンプレートとして扱い、テンプレートタイプパラメーターに渡される場合はタイプとして扱います。

これらのシナリオでは、挿入されたクラス名が常に型であることに依存している場合、有効なC ++ 03コードの動作が異なる場合があります。私のclangPRから取得したサンプルコード

template<template<typename> class X>
struct M { };

template<template<typename> class X>
void g(int = 0); // #1

template<typename T>
void g(long = 0); // #2

template<typename T>
struct A {
  void f() {
    g<A>(); /* is ambiguous in C++0x */
    g<A>(1); /* should choose #1 in C++0x */
  }
};

void h() {
  A<int> a;
  a.f();
}

C ++ 03では、コードは2番目のg時間を両方とも呼び出します。


C ++ 0xにより、C ++ 03で依存していた一部の名前が非依存になります。また、現在のクラステンプレートのメンバーを参照する非依存修飾名の名前ルックアップをインスタンス化時に繰り返す必要があり、これらの名前がテンプレート定義コンテキストで行われるのと同じ方法でルックアップすることを確認する必要があります。

この変更により、ドミナンスルールに依存する有効なC ++ 03コードがコンパイルされなくなる可能性があります。

例:

struct B { void f(); };

template<typename T>
struct A : virtual B { void f(); };

template<typename T>
struct C : virtual B, A<T> {
  void g() { this->f(); }
};

int main() { C<int> c; c.g(); }

呼び出すこの有効なC ++ 03コードA<int>::fは、C ++ 0xでは無効です。これは、インスタンス化時の名前ルックアップがではなく検索A<int>::fされB::f、定義時ルックアップとの競合が発生するためです。

現時点では、それがFDISの欠陥であるかどうかは明らかではありません。委員会はこれを認識しており、状況を評価します。


最後の部分が基本クラスを示す修飾名の修飾子の最後の部分の識別子と同じであるusing宣言。using宣言は、その名前のメンバーではなく、コンストラクターに名前を付けるようになりました。

例:

struct A { protected: int B; };
typedef A B;

struct C : B {
  // inheriting constructor, instead of bringing A::B into scope
  using B::B;
};

int main() { C c; c.B = 0; }

上記のサンプルコードはC ++ 03では整形式ですが、C ++ 0xでは整形式でA::Bはなく、でアクセスできませんmain

14
Lightness Races in Orbit 2013-10-23 06:25.

ストリーム抽出の失敗は別の方法で処理されます。

#include <sstream>
#include <cassert>

int main()
{
   std::stringstream ss;
   ss << '!';
   
   int x = -1;
   
   assert(!(ss >> x)); // C++03 and C++11
   assert(x == -1);    // C++03
   assert(x == 0);     // C++11
}

提案の変更

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3246.html#23

標準リファレンス

[C++03: 22.2.2.1.2/11]: ステージ2の処理の結果は、次のいずれかになります。

  • 一連の文字がステージ2に蓄積され、(の規則に従ってscanf)タイプの値に変換されvalます。この値はに格納されvalios_base::goodbitに格納されerrます。
  • ステージ2で蓄積された一連の文字によりscanf、入力の失敗が報告されます。ios_base::failbitに割り当てられerrます。[ed:何も保存されていませんval。]

[C++11: 22.4.2.1.2/3]: [..]格納する数値は次のいずれかになります。

  • 変換関数がフィールド全体の変換に失敗した場合はゼロios_base::failbitに割り当てられerrます。
  • フィールドがで表すには大きすぎる正の値を表す場合、最も正の表現可能な値valios_base::failbitに割り当てられerrます。
  • フィールドがで表すには大きすぎる負の値を表す場合は、最も負の表現可能な値、または符号なし整数型の場合はゼロvalios_base::failbitに割り当てられerrます。
  • それ以外の場合は、変換された値。

結果の数値はに格納されvalます。

実装

  • GCC4.8 はC ++ 11に対して正しく出力します:

    アサーション `x == -1 'が失敗しました

  • GCC4.5-4.8 はC ++ 03のすべての出力で、バグのように見えます。

    アサーション `x == -1 'が失敗しました

  • Visual C ++ 2008ExpressはC ++ 03用に正しく出力します。

    アサーションに失敗しました:x == 0

  • Visual C ++ 2012ExpressはC ++ 11に対して誤って出力します。これは、実装ステータスの問題のように見えます。

    アサーションに失敗しました:x == 0

13
Xeo 2011-06-19 13:52.

明示的な変換演算子の導入はどのように大きな変化ですか?古いバージョンは、以前と同じように「有効」です。

はい、からoperator void*() constへの変更explicit operator bool() constは重大な変更になりますが、それ自体が間違った方法で使用されている場合に限ります。適合コードは壊れません。

さて、もう1つの重大な変更は、集計の初期化中に変換を絞り込むことを禁止することです。

int a[] = { 1.0 }; // error

編集:覚えておいてくださいstd::identity<T>。C++ 0xで削除されます(注を参照)。型を依存させるのは便利な構造体です。構造体は実際にはあまり機能しないため、これで修正されるはずです。

template<class T>
struct identity{
  typedef T type;
};
8
James McNellis 2011-06-19 14:19.

コンテナライブラリには多くの変更が加えられており、より効率的なコードが可能になりますが、いくつかのコーナーケースでは下位互換性が失われます。

たとえば、std::vectorデフォルトの構造、C ++ 0x、および重大な変更について考えてみます。

7
Ben Voigt 2011-06-19 14:15.

下位互換性を壊す暗黙の移動について多くの議論がありました

(関連する議論のある古いページ)

コメントを読んでみると、暗黙の移動リターンも重大な変更です。

6
Lightness Races in Orbit 2011-06-19 14:02.
struct x {
   x(int) {}
};

void f(auto x = 3) { }

int main() {
   f();
}

C ++ 03:有効です。

C ++ 0x: error: parameter declared 'auto'

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

2021 年 6 月 8 日にニューヨーク市で開催された covid-19 パンデミックで亡くなった人々の命を偲び、祝うために、ネーミング ザ ロスト メモリアルズが主催するイベントと行進の最中に、グリーンウッド墓地の正門から記念碑がぶら下がっています。週末、ジョー・バイデン大統領は、covid-19 パンデミックの終息を宣言しました。これは、過去 2 年以上にわたり、公の場でそうするための長い列の中で最新のものです。

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

オハイオ州のエミリー・デシャネル みんな早く来て、ボーンズが帰ってきた!まあ、ショーボーンズではなく、彼女を演じた俳優. エミリー・デシャネルに最後に会ってからしばらく経ちました.Emily Deschanel は、長期にわたるプロシージャルな Bones の Temperance “Bones” Brennan としてよく知られています。

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

どうやら、ドナルド・トランプに近い人々は、今月初めにFBIによって家宅捜索された彼のMar-a-Lago財産からの映像を公開するよう彼に勧めています. 前大統領はテープを公開するかどうかを確認していませんが、息子はフォックス・ニュースにそうなるだろうと語った.

Andor は、他の Star Wars ショーから大きな距離を置きます。

Andor は、他の Star Wars ショーから大きな距離を置きます。

アンドールの一場面。数十年前、ジョージ・ルーカスがスター・ウォーズのテレビ番組を制作するのを妨げた主な理由は、お金でした。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language