スレッド: [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になるのだとか。
>> びあねセンセらによる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
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@...>
情報どうもありがとうございます。
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@...>