アカウント名:
パスワード:
C++0x基礎文法最速マスター [hatena.ne.jp]あたりを見れば大体の感じが掴めるのじゃないかと。
initializer_list [ocn.ne.jp]や範囲 for 文 [ocn.ne.jp]あたりは地味に便利というか、なぜ C++ 03 に入っていなかったのかレベル
前からあったほうの関数宣言なんですけど、レガシーコードの保守以外にメリットあるんですかね?新しい方を推奨にしちゃえよって気がするんですが。
dodongaです。
格上げの問題なので、慎重に;
C言語の場合: 以下の4通りが考えられます。
1,2は問題ないです。 3の場合、関数定義で小さな型を使うと問題が。実際の型で渡されるのに関数では格上げを期待 4の場合、関数定義で小さな型を使うと問題が。格上げされたのを期待してるのにそのままの型で渡される。
C++言語の場合: K&Rは認めれられて無く、プロトタイプが必須なので問題なし。
CとC++では、格上げにも非互換あるので、なんとも;;
// 今まで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
とは書けません。
前からあったほうの関数宣言なんですけど、レガシーコードの保守以外にメリットあるんですかね?
とあったので、K&Rと判断しちゃいました;
疑問ですが、
今回の変更(N2541 [open-std.org])は syntax のみの変更なので互換性の問題にはならないかと。
リンカ側は問題ないのでしょうか。# 純粋に疑問なだけです^^。
コンパイル時のみの変更で、関数の型が変わるわけではないので問題は無いと思います。
タレコミに書いたHerb Sutter 氏のブログ記事の翻訳を書いていた方のペ~ジを張っておきます。 http://d.hatena.ne.jp/ntnek/20110326 [hatena.ne.jp]
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
計算機科学者とは、壊れていないものを修理する人々のことである
おまえらもっと C++0x の話しようぜ (スコア:2, 参考になる)
C++0x基礎文法最速マスター [hatena.ne.jp]あたりを見れば大体の感じが掴めるのじゃないかと。
initializer_list [ocn.ne.jp]や範囲 for 文 [ocn.ne.jp]あたりは地味に便利というか、なぜ C++ 03 に入っていなかったのかレベル
Re: (スコア:0)
前からあったほうの関数宣言なんですけど、レガシーコードの保守以外にメリットあるんですかね?
新しい方を推奨にしちゃえよって気がするんですが。
Re:おまえらもっと C++0x の話しようぜ (スコア:1, 参考になる)
dodongaです。
格上げの問題なので、慎重に;
C言語の場合:
以下の4通りが考えられます。
1,2は問題ないです。
3の場合、関数定義で小さな型を使うと問題が。実際の型で渡されるのに関数では格上げを期待
4の場合、関数定義で小さな型を使うと問題が。格上げされたのを期待してるのにそのままの型で渡される。
C++言語の場合:
K&Rは認めれられて無く、プロトタイプが必須なので問題なし。
CとC++では、格上げにも非互換あるので、なんとも;;
閑話休題
Re:おまえらもっと C++0x の話しようぜ (スコア:1)
後者の記法は、戻り値の型が複雑な場合に簡単に書けるようになるという利点があります。 例えば、関数ポインタを返す関数を定義する場合、従来だと typedef を使って書いていたものが、
のように書けるようになります。 また、引数が戻り値の部分でも使えるようになるため、 C++0x で追加された decltype という式の型を表現するキーワードを使うと
と書けるようになります。 従来の関数定義の記法だと、f も t もスコープに入っていないので
とは書けません。
Re:おまえらもっと C++0x の話しようぜ (スコア:2, オフトピック)
dodongaです。
とあったので、K&Rと判断しちゃいました;
疑問ですが、
リンカ側は問題ないのでしょうか。
# 純粋に疑問なだけです^^。
閑話休題
Re:おまえらもっと C++0x の話しようぜ (スコア:1)
コンパイル時のみの変更で、関数の型が変わるわけではないので問題は無いと思います。
Re:おまえらもっと C++0x の話しようぜ (スコア:2)
dodongaです。
タレコミに書いたHerb Sutter 氏のブログ記事の翻訳を書いていた方のペ~ジを張っておきます。
http://d.hatena.ne.jp/ntnek/20110326 [hatena.ne.jp]
閑話休題