パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

C++0x の最終国際規格案が委員会を通過、夏にも発行予定」記事へのコメント

  • C++0x基礎文法最速マスター [hatena.ne.jp]あたりを見れば大体の感じが掴めるのじゃないかと。

    initializer_list [ocn.ne.jp]や範囲 for 文 [ocn.ne.jp]あたりは地味に便利というか、なぜ C++ 03 に入っていなかったのかレベル

    • by Anonymous Coward

      前からあったほうの関数宣言なんですけど、レガシーコードの保守以外にメリットあるんですかね?
      新しい方を推奨にしちゃえよって気がするんですが。

      • Re: (スコア:1, 参考になる)

         dodongaです。

         格上げの問題なので、慎重に;

         C言語の場合:
         以下の4通りが考えられます。

        1. K&R 関数宣言で、K&R 関数定義
        2. ANSI関数宣言で、ANSI関数定義
        3. ANSI関数宣言で、K&R 関数定義
        4. K&R 関数宣言で、ANSI関数定義

         1,2は問題ないです。
         3の場合、関数定義で小さな型を使うと問題が。実際の型で渡されるのに関数では格上げを期待
         4の場合、関数定義で小さな型を使うと問題が。格上げされたのを期待してるのにそのままの型で渡される。

         C++言語の場合:
         K&Rは認めれられて無く、プロトタイプが必須なので問題なし。

         CとC++では、格上げにも非互換あるので、なんとも;;

        --
        閑話休題
        • 今回の変更(N2541 [open-std.org])は syntax のみの変更なので互換性の問題にはならないかと。

          // 今まで
          int hoge(int var) { ... }
          // C++0x で可能になる記法
          auto hoge(int var) -> int { ... }

          後者の記法は、戻り値の型が複雑な場合に簡単に書けるようになるという利点があります。 例えば、関数ポインタを返す関数を定義する場合、従来だと typedef を使って書いていたものが、

          auto fpif(int)->int(*)(int)

          のように書けるようになります。 また、引数が戻り値の部分でも使えるようになるため、 C++0x で追加された decltype という式の型を表現するキーワードを使うと

          template <class F, class T>
          auto apply(F f, T t) -> decltype(f(t)) { return f(t); }

          と書けるようになります。 従来の関数定義の記法だと、f も t もスコープに入っていないので

          template <class F, class T>
          decltype(f(t)) apply(F f, T t) { return f(t); } // compile error

          とは書けません。

          親コメント

開いた括弧は必ず閉じる -- あるプログラマー

処理中...