スレッド: [cppll:12885] Re: <fyi> C++0x videos

スレッド

[cppll:12885] Re: <fyi> C++0x videos

[ | ▲ / | ]
Subject:
[cppll:12885] Re: <fyi> C++0x videos
From:
Motonari Ito <hello_sequoia@...>
Date:
Sun, 15 Apr 2007 16:23:33 -0700 (PDT)
X-Mailer:
YahooMailRC/478 YahooMailWebService/0.7.41.10
Message-Id:
<904640.80102.qm‐at‐web50307.mail.re2.yahoo.com>
伊藤です。

>> びあねセンセらによるC++0x 新機能解説ビデオが
>> Google Video に公開されちょります。

すばらしいです。ご紹介ありがとうございました。

> #でも20分ごろツッコミの入ってるスライド、explicitは
> #doubleのctorにつけた方が説明として正しいような…

実は3月にもアメリカのサンタクララで同じプレゼンテーションがあったのですが、
そこで(事後に)配布された資料では

typedef char* Pchar;
Pchar p(7);// error (good!)
Pchar(7);// fine (ouch!)

という例に変わっていました。やはり、間違いだったのだと思います。

> 良く分からなかったのは、 MyType x = { 1, "str" } みたいな
> 型の違うリテラルからなる初期化リストを受け付けるのかどうか。

ええと、それは

struct S {
 int foo;
 std::string bar;
};

S s = {1, "str};

みたいな話でしょうか? だとしたら現状のC++でもできるはず? すいません、
よくわかりませんでした。

> あとconstexprは初耳でした。これも、inline関数では駄目な
> 理由がいまいち分からない…。

どこかでこういう例があがっていました。

const int max(){ return 10;}

int main(){
   const int size1 = 10;
   const int size2 = max();
   
   char foo1[size1];  // OK
   char foo2[size2]; // NG
}

これが NG になるのがいやだな、と。そこで、

constexpr int max(){ return 10;}


にするとOKになるのだとか。

[cppll:12901] Re: <fyi> C++0x videos

[ | / ▼ | ]
Subject:
[cppll:12901] Re: <fyi> C++0x videos
From:
Kent.N <kentn@...>
Date:
Sun, 22 Apr 2007 23:48:01 +0900
X-Mailer:
Becky! ver. 2.25.01 [ja]
Message-Id:
<20070422221611.D885.KENTN‐at‐m4.dion.ne.jp>
In-Reply-To:
12885
References:
12884 12885
Kent.Nです。

情報どうもありがとうございます。

On Sun, 15 Apr 2007 16:23:33 -0700 (PDT)
Motonari Ito <hello_sequoia@...> wrote:

> > #でも20分ごろツッコミの入ってるスライド、explicitは
> > #doubleのctorにつけた方が説明として正しいような…
>
> 実は3月にもアメリカのサンタクララで同じプレゼンテーションがあったのですが、
> そこで(事後に)配布された資料では
>
> typedef char* Pchar;
> Pchar p(7);// error (good!)
> Pchar(7);// fine (ouch!)
>
> という例に変わっていました。やはり、間違いだったのだと思います。

話の流れとしては「セマンティックによって初期化の振る
舞いが変わる」という問題点を指摘している部分ですから、
この説明で十分ですね。

で、initializer listは(さすがに新しく作る機能らしく)
そういった振る舞いの違いはない、と。

> > 良く分からなかったのは、 MyType x = { 1, "str" } みたいな
> > 型の違うリテラルからなる初期化リストを受け付けるのかどうか。
>
> ええと、それは
>
> struct S {
>   int foo;
>   std::string bar;
> };
>
> S s = {1, "str};
>
> みたいな話でしょうか? だとしたら現状のC++でもできるはず? すいません、
> よくわかりませんでした。

はい、そういう話です。ただし組み込みの初期化でなく、
initializer_list(か、それに類するもの)を使って自由に
振る舞いを変えられるのかな、と思ったので。

これができれば、クラスメンバの定義順を公開していなくても
配列初期化ができて嬉しいんじゃないかと。例えば上のSの配列を
作るときは
 S s_array[] = { {1, "a"}, {2, "b"} };
と書けますが、もしSの定義に後で手を加えて
 struct S {
   int new_field;
   int foo;
   std::string bar;
 };
とやったとしても、
 S::S(initializer_set<int,std::string>& il)
 {
   foo = il.get<0>();
   bar = il.get<1>();
 }
とか定義すれば、使う側はその変更を意識しなくてよい、とか。

どうもそういう話ではないみたいですね。

> > あとconstexprは初耳でした。これも、inline関数では駄目な
> > 理由がいまいち分からない…。
(skip)
> int main(){
>     const int size1 = 10;
>     const int size2 = max();
>     
>     char foo1[size1];  // OK
>     char foo2[size2]; // NG
> }
>
> これが NG になるのがいやだな、と。そこで、
>
> constexpr int max(){ return 10;}
>
> にするとOKになるのだとか。

なるほど、確かにinlineでの最適化の枠を超えている
(文法的に許されていない)ですね。

#この辺かな?
http://www.informit.com/guides/content.asp?g=cplusplus&seqNum=315&rl=1
http://www.informit.com/guides/content.asp?g=cplusplus&seqNum=322&rl=1


p.s.

…で、ためしにConceptGCCで次世代C++の世界を遊ぼうと
思ったんですが、泣くほど重いですねえ (T_T)

--
Kent.N <kentn@...>

Navigation

検索

[検索ヘルプ]

Maintener: Tietew <www.tietew.jp>
Powered by Ruby on Rails, Mongrel, PostgreSQL, and Hyper Estraier.
click here