C++0x 9at TECH
C++0x 9 - 暇つぶし2ch428:デフォルトの名無しさん
10/04/29 22:55:37
もう1つ、

A a(A(1));
A a(foo());

でも同じ状況でVC++2010はエラーになる。
ただし、後者ではコピーコンストラクタを有効にして実際に実行してみると
ムーブコンストラクタしか動かない。
(前者は最適化されてコピーやムーブ自体が実行されない)

429:デフォルトの名無しさん
10/04/29 22:58:37
VC++2010、地味にヤバそうな予感
まだゴリゴリ書かない方がいいのか・・・ って、何か問題起きたら 2008に持ってけばいいのかw


430:デフォルトの名無しさん
10/04/29 23:00:14
いや、すまん
>>428 は後者も最適化されてコピーもムーブも動かないわ

431:デフォルトの名無しさん
10/04/29 23:02:53
ムーブコンストラクタはそんなに神経質に使うものじゃなくないか?適用されたら儲け程度に考えればいいんじゃね。

432:デフォルトの名無しさん
10/04/29 23:09:23
void hoge(A&& a) {
 a.piyo(); // piyoは非constメンバ関数

 A b(a); // ムーブ? コピー?
 b.piyo();
}

hoge(A());

これでコピーコンストラクタが動いたんだけど
ひょっとしてムーブコンストラクタの考え方、俺間違ってる?

a.piyo(); が実行できたという点では
右辺値参照万歳ではあるんだけど

433:デフォルトの名無しさん
10/04/29 23:12:59
>>432
ムーブしたかったら A b(std::move(a)) じゃないか?

434:デフォルトの名無しさん
10/04/29 23:14:57
>>432
そこで勝手にmoveしちゃったらその後のaはどうなるんだよ

435:デフォルトの名無しさん
10/04/29 23:14:57
>>433
おお、そうなんだ
そうしたらムーブコンストラクタが呼ばれたわ
ありがとう

436:デフォルトの名無しさん
10/04/29 23:15:59
>>434
あとは野となれ山となれ

437:デフォルトの名無しさん
10/04/29 23:22:26
というか、>>422 のエラー発生状況の説明が
「'A' から 'A &&' への変換時」ってなってるな
どうもムーブコンストラクタを呼ぼうとはしているみたいだ
でも、なぜかコピーコンストラクタがアクセス可能じゃないとダメ、と

'A' から 'A &&' への変換に
なぜコピーコンストラクタへのアクセス可能性が要求されるのだろう?

438:デフォルトの名無しさん
10/04/29 23:24:40
名前付きの値は(左辺値参照でも右辺値参照でも)左辺値として扱われる。
>>432 の例でいうとaをムーブコンストラクタに渡すには
std::moveの返値(無名の右辺値参照)にしなければいけないわけだ。
なるほど。

439:デフォルトの名無しさん
10/04/29 23:27:24
>>438
なるほど
ムーブコンストラクタがあっても、
左辺値でコンストラクとしようとする時には
勝手に右辺値参照になってはくれないのね
確かに安全のためには必要そうな仕様だ

440:デフォルトの名無しさん
10/04/29 23:40:37
ひょっとして、ムーブ可能にしたければ
コピーも可能じゃないとだめというのが仕様だとか?
でも、MoveConstructible requirements にそういう事は書いてないし・・・

441:デフォルトの名無しさん
10/04/30 02:11:51
>427
>publicなムーブコンストラクタとprivateなコピーコンストラクタを定義したら、
>コピーコンストラクタが使えないよというエラーになるから

再現しないっぽいのでとりあえずコード全体をさらしてほすぃ……

442:デフォルトの名無しさん
10/04/30 02:18:31
422==432で書いてたコードand/or考えが間違ってたんだろう

443:デフォルトの名無しさん
10/04/30 03:01:44
不思議な事に、こっちでも新しく書いたら再現しない
条件があるのかも

444:デフォルトの名無しさん
10/04/30 03:06:11
めっちゃアンドゥして昔のコードに戻したけどやはり再現しない・・・
一体なんなんだ

445:デフォルトの名無しさん
10/04/30 03:47:00
auto p = new auto(1);
delete p; // 死ぬ
auto p = new auto(2.0 * 3.4);
delete p; // 死ぬ
auto p = new auto("hoge");
delete p; // 死ぬ

基本型を引数に取ってnew autoすると
delete時に死ぬ

クラスとかなら問題ない

446:デフォルトの名無しさん
10/04/30 04:13:09
new autoとかありだということに驚いた

447:デフォルトの名無しさん
10/04/30 06:30:36
最後はdelete[]だろ

448:デフォルトの名無しさん
10/04/30 07:18:27
>>445
どのコンパイラくらい書いてくれ。

449:デフォルトの名無しさん
10/04/30 08:18:51
死ぬってのは実装の問題ってこと?

450:デフォルトの名無しさん
10/04/30 08:35:12
VC++2010で試したら確かに実行時エラーで死んだ。
誰かGCCで試してみてほしい。

451:デフォルトの名無しさん
10/04/30 08:51:30
なんだこのスレタイと全然関係無い話題なのに
妙に価値のある内容は。





もっとやれ

452:デフォルトの名無しさん
10/04/30 09:50:00
>>445
g++-4.5 (Debian 4.5.0-2) 4.5.1 20100419 (prerelease)
だと死なない(そりゃそうだ)

453:デフォルトの名無しさん
10/04/30 10:47:13
>>447
ポインタをnewしてるだけだからdeleteで問題ない

454:デフォルトの名無しさん
10/04/30 11:39:19
new auto("hoge") は const char**

455:デフォルトの名無しさん
10/04/30 12:45:29
deleteかdelete[]かを判断できないのだからnew auto(ここの部分);で、動的にdeleteかdelete[]かを選べるshared_ptrみたいな動的削除子が組み込みで欲しいな。

456:デフォルトの名無しさん
10/04/30 12:47:09
          expression
         /     \
       glvalue     rvalue
     /    \  /    \
   lvalue     xvalue    prvalue

Figure 1 -- Expression category taxonomy

何か笑ってしまった
複雑だなあ

457:デフォルトの名無しさん
10/04/30 12:48:04
>>455
new auto で確保したものは常に delete
配列 new を初期化パラメータ付きで行うのは不可能だから

458:デフォルトの名無しさん
10/04/30 12:51:23
そうだった。つまりこれはnew autoしたのをdeleteする処理系が悪いということか。

459:デフォルトの名無しさん
10/04/30 12:55:10
new autoは実はGCが働くんだよ!

だったらいいんだが
autoってそんな意味じゃねー

460:デフォルトの名無しさん
10/04/30 12:57:51
newしてるのにポインタじゃなくてスマポが返るんですね分かります

461:デフォルトの名無しさん
10/04/30 13:07:33
>>456
仮想継承にしなくちゃならないなw

462:デフォルトの名無しさん
10/04/30 13:12:08
>>456
シンプルやん。
対称だと頭に入りやすい。

463:デフォルトの名無しさん
10/04/30 13:30:37
          expression
         /     \
       lvalue     rvalue
     /    \  /    \
   plvalue     xvalue    prvalue

これなら対称なんだけど

464:デフォルトの名無しさん
10/04/30 13:32:57
>>463
機能まで対称だったらわざわざ仮想継承構造にする必要ないけどな

465:デフォルトの名無しさん
10/04/30 13:35:43
lvalue &
rvalue &&
prvalue &&&
になりそうな予感

466:デフォルトの名無しさん
10/04/30 13:41:13
int n = 0;
auto l = [=]() mutable { ++n; std::cout << n << std::endl; };
l(); //1と表示
l(); //2と表示

ラムダ式を作成した時に
クロージャ型の非staticメンバ変数のnに外のnがコピーされるから、
それを変更すると次の呼び出しでもその影響が残るのは
仕様でいいのよね?

467:デフォルトの名無しさん
10/04/30 14:28:27
ラムダ式はreturnできないし(template<class L> L hoge(L lambda) { return lambda; } みたいなのは例外で可能だが)、
関数ポインタに渡せないんだな
前者は戻り値の型が書けないからで、
後者は関数呼び出しがクロージャ型の非staticメンバ関数だからだな
どちらも仕方が無いけど、微妙に不便

まあ後者は、クロージャ型の非staticメンバ変数に
operator() を自インスタンスを使って call するコードを
持たせる事で実現できるとは思うのだが、
メモリの実行権限とか考えると微妙だわなあ

468:デフォルトの名無しさん
10/04/30 15:15:49
>>465
> lvalue &
> rvalue &&
> prvalue &&&
何気に分かりやす・・・くねぇな


469:デフォルトの名無しさん
10/04/30 17:34:03
って、規格上はラムダ式は関数ポインタに変換できるのか……
今年3月の話みたいだから対応して無いのは当然だけど

470:デフォルトの名無しさん
10/04/30 17:38:11
関数ポインタよりもresult_typeが欲しいよ。

471:デフォルトの名無しさん
10/04/30 18:09:13
std::functionにキャストすれば使えるんじゃないの>result_type

472:デフォルトの名無しさん
10/04/30 19:06:02
>>471
なんと、その手があったのか。改めてfunctionはすごいな。
ラムダ式をboost::lambdaでラップしようかとか悩んでた。

473:デフォルトの名無しさん
10/04/30 21:11:54
swap技法が適用されるデフォルトムーブ演算子operator=(&&)とかできないかなあ。

474:デフォルトの名無しさん
10/04/30 21:40:51
デフォルトムーブ代入演算子なら最新のドラフトに入ったよ

475:デフォルトの名無しさん
10/04/30 23:09:11
戻り値の型を auto にして trailing return type を省略し
return する値の型を全て同じにすれば
戻り値の型を自動的に類推してくれる、
という仕様は検討された事ないのかな
それがあれば関数をカリー化して返せるんだが

auto add(int n) {
 return [=](int x) { return x + n; };
}

476:デフォルトの名無しさん
10/04/30 23:14:48
>>474
おおっとそれはすごい。VC10にいつかはサポートされるかな。
現状のVC10はどこまでサポートされてるのかさっぱり分らない。SPが出るたびに調整かw

477:デフォルトの名無しさん
10/04/30 23:29:33
>>475

 auto add = [](int n) {
  return [=](int x) { return x + n; };
 };

で我慢しろ

478:デフォルトの名無しさん
10/04/30 23:37:39
>>476
URLリンク(blogs.msdn.com)
URLリンク(wiki.apache.org)

479:デフォルトの名無しさん
10/05/01 00:02:33
Unified Function Syntaxも戻り値の型推測入れればいいのに

480:デフォルトの名無しさん
10/05/01 00:15:10
>>475
宣言だけの場合は?

481:デフォルトの名無しさん
10/05/01 01:14:15
>>480
inline や template と同様、ヘッダにしか書けない
ただし、static を明示的につけない限り、リンク時に実体は1つにまとめられる
宣言だけ書くことはできるが、同じ翻訳単位に定義が必要

みたいな感じで

482:デフォルトの名無しさん
10/05/01 01:15:40
×ヘッダにしか書けない
○複数の翻訳単位から利用するにはヘッダにしか書けない

483:デフォルトの名無しさん
10/05/01 01:18:30
まあ、同じ定義を自分で複数の翻訳単位に書いてもいいんだけど
それはそれこれはこれということで

484:デフォルトの名無しさん
10/05/01 01:38:18
>>478
ありがとう。対応状況が一目で分かって助かります。

485:デフォルトの名無しさん
10/05/01 11:05:51
引数が二個ある関数で右辺値参照するときは、
こんな風に全ての組み合わせがいるの?

hoge func(const fuga& a,const piyo& b);
hoge func( fuga&& a,const piyo& b);
hoge func(const fuga& a, piyo&& b);
hoge func( fuga&& a, piyo&& b);


486:デフォルトの名無しさん
10/05/01 11:30:56
どういう使い方するかによるんじゃない
普通は一方をもう一方の情報を使って変更して
変更したオブジェクトを返すという形にすると思うけど

487:デフォルトの名無しさん
10/05/01 13:19:54
VC10で is_pod<void>::value がtrueになるのは相変わらずか。

488:デフォルトの名無しさん
10/05/01 16:03:18
>>485
なるほど、通常は片方だけですむってことなのか。

489:デフォルトの名無しさん
10/05/02 04:07:58
ラムダ面白いな。
てきとーにVC10ee触ってるんだが、ラムダって制限つきローカル関数のように使えるな。
さらに便利かも。

490:デフォルトの名無しさん
10/05/02 08:57:41
確かにfor_eachなどに直接渡すだけじゃなく、ローカル関数として使えるね
これでいちいち関数内に構造体作る必要がなくなったわ
しかもメンバにも直接アクセスできるし

491:デフォルトの名無しさん
10/05/02 09:48:03
ラムダ関数はresult_typeを定義してくれてたら完璧なんだけど

492:デフォルトの名無しさん
10/05/02 12:15:28
その辺はconceptで整備するつもりだったんだろうけど…
function_traitsを定義するんで凌ぐのかな。

493:デフォルトの名無しさん
10/05/02 15:36:14
>>490
メンバにもアクセスできるの?!

ローカルクラスとかわんないと思いこんでた

494:デフォルトの名無しさん
10/05/02 15:39:58
環境いじれないのはlambda式じゃないぜ…

495:デフォルトの名無しさん
10/05/02 16:43:10
thisをキャプチャすればメンバに触れる
どうせ[=]か[&]にするだろうから
自動的にキャプチャされるだろうが

496:デフォルトの名無しさん
10/05/02 19:02:42
むしろthisがキャプチャされない場合って...?

497:デフォルトの名無しさん
10/05/02 19:36:34
[]にしたい時だってある

498:デフォルトの名無しさん
10/05/02 20:48:36
引数しか使わない
そんな気分の時があります

499:デフォルトの名無しさん
10/05/02 20:59:31
キャプチャってなんだーー!!!

ああ、0xのLambda式か。

500:デフォルトの名無しさん
10/05/03 00:01:17
autoって本当に便利ですね。てかテンプレートには必須だよ。


501:デフォルトの名無しさん
10/05/03 00:08:41
キャプチャしない場合でも、[&][=]って書いてもペナルティはない?
紛らわしいからやめろと言われればその通りなんだが、コンパイラがどういうコードを吐くのか気になる

502:デフォルトの名無しさん
10/05/03 00:15:16
最適化すりゃ消える

503:デフォルトの名無しさん
10/05/03 00:15:56
むしろ追加でコード生成されんの?

504:デフォルトの名無しさん
10/05/03 00:28:00
lambdaって戻りを省略できるると思ってたのですが。
VC10です。C++0xWikipediaにも省略できるって書いてあるのに?
auto z0=[](int x)->{return x;}; //エラー
auto z1=[](int x)->int{return x;}; //OK
auto z2=[](int x)->decltype(x){return x;};//OK


505:デフォルトの名無しさん
10/05/03 00:29:10
すまん,キャプチャの意味がわかってなかった...

506:デフォルトの名無しさん
10/05/03 00:43:19
>>504
おばか

507:デフォルトの名無しさん
10/05/03 00:49:10
省略の意味がちげえw

508:デフォルトの名無しさん
10/05/03 05:56:52
>>502
コピコンのあるようなものがいらっしゃると消えてくれないかも

509:デフォルトの名無しさん
10/05/03 09:42:06
[](int x){return x;}

510:デフォルトの名無しさん
10/05/03 10:45:04
->int とかの trailing-return-type って普通の関数定義にも使えるんだな
用途がよくわからんが

511:デフォルトの名無しさん
10/05/03 10:52:02
Phase of translation の 5 なんだけどさ

std::printf("%.4x\n", (int) u'\u0905'); //デーバナーガリー文字 \u0905

↓ phase 5

実行時キャラクターセットに対応する文字が無ければ
'\0'以外の適当な文字に置き換えられる
(eucとかだったら \u0905 は無い)

std::printf("%.4x\n", (int) u'?');


実行結果: 003f (プレフィクス u をつけてもやっぱり 0905 にならない)

―ってこと? 最近のOSなら大丈夫なんだろうけど。


512:デフォルトの名無しさん
10/05/03 11:06:26
>>507 kwsk

513:デフォルトの名無しさん
10/05/03 12:50:15
>>510
template <typename T>
auto foo(T a, T b) -> decltype(a + b) { return a + b; }

とかできるよね、という話らしいよ

514:デフォルトの名無しさん
10/05/03 12:54:00
あとは auto foo() -> int(*)(); とか、関数ポインタや配列ポインタを返しやすいとか

515:デフォルトの名無しさん
10/05/03 12:57:20
そういやlambdaはDLLにexportできるようになるんかな?

516:デフォルトの名無しさん
10/05/03 12:58:54
exportするなら普通の関数でええやんという話

517:デフォルトの名無しさん
10/05/03 12:59:27
>>509 あ、そうか。そうだような。俺が馬鹿でした。
でもさすがにC#のように引数の型を省略 auto z3=[](x){return x*2;}; は無理?とおもったけど。
auto z4=boost::lamabda::_1*2; はOKなのね。boost::lambda恐るべし。

518:デフォルトの名無しさん
10/05/03 13:02:53
C#の型推論はデリゲート側と型を一致させるというしくみだから
autoで受けるC++0xではまあ使えないわなあ

519:デフォルトの名無しさん
10/05/03 13:10:52
>>513-514
なるほど、納得。

520:デフォルトの名無しさん
10/05/03 13:13:25
どんどん初心者お断りで複雑怪奇な仕様になっていってる気がする…

521:デフォルトの名無しさん
10/05/03 13:14:46
なにをいまさら

522:デフォルトの名無しさん
10/05/03 13:15:43
カンタンカンタン

523:デフォルトの名無しさん
10/05/03 14:41:40
>511

u'\u0905' wchar16_t だから「実行時キャラクターセット」は使われません。
どんな環境でも UTF-16 エンコードが使われます。
0x0905 と同じ表現を持つ値となります。



524:デフォルトの名無しさん
10/05/03 16:44:54
>>523
実行文字集合に無い文字は、翻訳段階5でいったん文字化けさせろって書いてない?
「文字(列)リテラル中のユニバーサルキャラクター名は、実行文字集合中の対応物に置き換える」

リテラル中の文字が、ユニコードでどの値を持つか評価されるのって、その後だよね?


525:デフォルトの名無しさん
10/05/03 20:40:41
>>520
分かる部分だけ使ってりゃいいって

526:デフォルトの名無しさん
10/05/03 21:01:41
コンセプトが入ってればエラーメッセージが(以下略

527:デフォルトの名無しさん
10/05/04 00:06:10
C++0xはよく考えられた改良だと思うけど
互換性のために殆どが「追加」になっちゃうんだよね
便利でシンプルで完全に動作するC++のサブセットって定義できんもんだろうか

528:デフォルトの名無しさん
10/05/04 00:08:11
互換性を無視したとして、いらない機能は何だろう?
つ可変引数


529:デフォルトの名無しさん
10/05/04 00:11:23
それは要るだろw
筆頭は0=ヌルポインタだな。

530:デフォルトの名無しさん
10/05/04 00:13:03
古い(というか従来の)関数宣言
struct か class のどちらか
古い(というか従来の) enum

531:デフォルトの名無しさん
10/05/04 00:17:07
typedef

532:デフォルトの名無しさん
10/05/04 00:17:40
型変換演算子の廃止

533:デフォルトの名無しさん
10/05/04 00:18:19
コピコンとデフォコンの特殊ルール

534:デフォルトの名無しさん
10/05/04 00:19:06
unsigned全部

535:527
10/05/04 00:29:42
>>527 は新しい言語を作るんじゃなくてサブセットを定義して学習のコスト削減を意図してました
仕様変更ではなくコーディングルールみたいなもん

536:デフォルトの名無しさん
10/05/04 00:32:07
>>529
printfみたいに引数の検査ができな可変引数よりも、
cout<<a<<b; とか boost::format("%d %d")%a&b;
とかてC++の機能で代用できるもので可変引数は廃止でいいんじゃないか?

hoge a(); が関数のプロトタイプになるのはなくしていいとおもう。

537:デフォルトの名無しさん
10/05/04 00:34:21
boost::format("%d %d")%a%b; だった。

538:デフォルトの名無しさん
10/05/04 00:43:08
これだろ…
std::vector<bool>

539:デフォルトの名無しさん
10/05/04 00:48:27
1パスコンパイル

540:デフォルトの名無しさん
10/05/04 00:49:54
bind1st , bind2nd, fun_ptr

541:デフォルトの名無しさん
10/05/04 00:51:57
>>536
printfを例に出すとは素質悪いな

542:デフォルトの名無しさん
10/05/04 00:56:10
禿の新しいC++本(Programming: Principles and Practice Using C++)で
10行程度しか触れられていない
valarray

543:デフォルトの名無しさん
10/05/04 00:56:45
互換性を無視していいならいらない機能の筆頭は、暗黙の変換
バグの元

544:デフォルトの名無しさん
10/05/04 00:59:15
アップキャストがバグの元っていったい

545:デフォルトの名無しさん
10/05/04 01:00:58
>>544
non-explicitなコンストラクタとかoperator T()のことじゃない?

546:デフォルトの名無しさん
10/05/04 01:02:40
整数の暗黙の拡張とか

547:デフォルトの名無しさん
10/05/04 01:10:06
暗黙の変換というか標準変換の一部と言うべきなのか
要するに数値型間の暗黙の変換

548:デフォルトの名無しさん
10/05/04 01:57:08
charをintegral typeから外して、integral type最小のbyteを設ける。

549:デフォルトの名無しさん
10/05/04 01:59:30
暗黙の型変換なくす人、
xがintの時、式 x * 3.14 の型はintでOK?

550:デフォルトの名無しさん
10/05/04 02:00:56
コンパイルエラー

551:デフォルトの名無しさん
10/05/04 02:02:56
>>549
#pragma yutori
ならばOK


552:デフォルトの名無しさん
10/05/04 02:05:09
整数の拡張って何がまずいん?

553:デフォルトの名無しさん
10/05/04 02:10:00
unsigned int x = -1;
がコンパイルできちゃう

554:デフォルトの名無しさん
10/05/04 02:21:52
static_cast使いまくりで可読性が悪くなりそう

555:デフォルトの名無しさん
10/05/04 02:28:01
>>491
result_ofが使えればいいよ。

556:デフォルトの名無しさん
10/05/04 02:29:28
>>553
警告が出るからいいんじゃね?

557:デフォルトの名無しさん
10/05/04 02:32:38
数値の暗黙の拡張にこれほど疑問や反論がでるのは予想外だった
正直、ほとんどの人に共通の認識だと思ってた

558:デフォルトの名無しさん
10/05/04 02:35:27
>>556
これには警告でないでしょ
gcc -Wall でも警告でないはず

unsigned f(int y)
{
unsigned int x = y;
return x;
}

unsigned int g()
{
return f(-1);
}


559:デフォルトの名無しさん
10/05/04 06:01:55
-Wsign-conversion で警告がでるな

560:デフォルトの名無しさん
10/05/04 11:10:01
-Wextra

561:デフォルトの名無しさん
10/05/04 11:48:53
-Warata

562:デフォルトの名無しさん
10/05/04 11:53:26
-Wwwwwwww

563:デフォルトの名無しさん
10/05/04 12:09:41
多少ずれるが
unsigned変数の小なり0比較はエラーにすべき

564:デフォルトの名無しさん
10/05/04 12:52:01
>>563
警告出して最適化してくれれば十分だと思う。
テンプレート使ってるとsignedとunsinged両方使えるようにするとき役に立つ。
警告なら必要に応じて抑制できるけど、エラーだとsignedとunsingedで分岐するテンプレートを書く必要が出てきて面倒。


565:デフォルトの名無しさん
10/05/04 12:54:21
最適化というのは,勝手にsigned変数に変更するということ?
それとも比較元を+1して小なり1比較ってこと?

566:デフォルトの名無しさん
10/05/04 12:55:00
いや、常にfalse判定じゃないかと

567:デフォルトの名無しさん
10/05/04 13:01:05
うんfalse判定でifのtrue項が削除されてとりあえず警告。その箇所だけpragmaで警告抑制。


568:デフォルトの名無しさん
10/05/04 14:48:38
>>563
エラーにするのはループ条件に出てきた時だけでいい
その他の場合はフェイルセーフで書く事もあるので警告すら出て欲しくないな

569:デフォルトの名無しさん
10/05/04 15:37:34
>>568
ループ条件に出てきたときはループ削除でよくない?エラーはやりすぎでしょう。

570:デフォルトの名無しさん
10/05/04 15:39:53
>>569
ごめん
別な条件の方で考えてた
(unsigned)x >= 0 の方

571:デフォルトの名無しさん
10/05/04 19:07:10
-Wallでも警告されずバグを埋め込んだ例
URLリンク(bugzilla.kernel.org)

572:デフォルトの名無しさん
10/05/04 20:28:37
>>571
すげー
Linus Torvalds の生コメントがある!

・・・でもLinusはC++大嫌いだったな確か。

573:デフォルトの名無しさん
10/05/04 21:36:18
enum class って劣化 Java の enum だよね
Java の enum そのものにしてくれないかなぁ・・

574:デフォルトの名無しさん
10/05/04 22:21:57
どちらかといえばC#のenumが近い

575:デフォルトの名無しさん
10/05/04 22:26:04
それは確かに否め(enumえ)ない

576:デフォルトの名無しさん
10/05/04 22:39:39
>>573
Java の enum ってどういう挙動なんだか知らんが
そんなに良いのか?

577:デフォルトの名無しさん
10/05/04 22:56:31
Javaのenumはクラスに近くて、
要素の宣言でコンストラクタに渡すパラメータを指定できる。

578:デフォルトの名無しさん
10/05/04 23:03:51
>>577
ふーん。ありがとう。

いっそenum class とenum structみたいに2種類にして
機能を分ければよかったのにね。


579:デフォルトの名無しさん
10/05/04 23:19:42
enumとして正しい値かどうか検査するメンバ関数とか
enum名を文字列で返すメンバ関数とか欲しいわ

580:デフォルトの名無しさん
10/05/04 23:42:32
>>576
enum class は単に enum をタイプセーフにしただけだけど、Java のはメソッドをもてたり、
各要素毎にオーバーライドして振る舞いも変更できる。

public enum Operation {
    PLUS("+") { double eval(double x, double y) { return x + y; } },
    MINUS("-") { double eval(double x, double y) { return x - y; } },
    TIMES("*") { double eval(double x, double y) { return x * y; } },
    DIVIDE("/") { double eval(double x, double y) { return x / y; } };

    abstract double eval(double x, double y);

    private Operation(String op) {
        op_ = op;
    }

    private String op_;
}

Operation.PLUS.eval(10, 3); // -> 13

これ結構便利だと思う。C++にも同等の機能入れてくれないかな

581:デフォルトの名無しさん
10/05/04 23:59:20
そこまでするならクラスでいいじゃん、と思う

582:デフォルトの名無しさん
10/05/05 00:06:13
先生!!メリットがわかりませんん!!

583:デフォルトの名無しさん
10/05/05 00:10:28
enum class {} というのは指定したクラスのconstインスタンスを名前を
付けて列挙するものという意味付けにすれば後は何でも出来そうな。

584:デフォルトの名無しさん
10/05/05 00:21:49
Scala の case class の超絶しょぼい版という印象だな > Java の enum

585:デフォルトの名無しさん
10/05/05 00:22:54
演算子のオーバーロードは今のenumでもできるが

586:デフォルトの名無しさん
10/05/05 00:28:55
Javaほど機能詰めすぎると逆にイミフなような…

俺がほしかったのは"スコープつきのタイプセーフな列挙子"だし、
機能詰め込んだとしてもC#のenum程度でいいよ

587:デフォルトの名無しさん
10/05/05 00:39:09
ToStringは欲しかった

588:デフォルトの名無しさん
10/05/05 00:58:06
boost::lexical_cast

589:デフォルトの名無しさん
10/05/05 01:10:52
typeidのnameをもっとまともに規定してほしかった。

590:デフォルトの名無しさん
10/05/05 01:16:59
>>588
それもSTLコンテナの場合、operator<<が定義されてないから使えないんだよな……

591:デフォルトの名無しさん
10/05/05 01:23:39
自分で定義すれば良いんじゃね?

592:デフォルトの名無しさん
10/05/05 01:32:26
>>589
ちゃんと読める名前を返すものと、一意性さえあればいいものと、2つ用意して欲しいわ

593:デフォルトの名無しさん
10/05/05 01:36:48
typeidの名前の文字列をバイナリに含めるか含めないかのオプションが欲しい

594:デフォルトの名無しさん
10/05/05 15:03:54
ラムダ式を関数ポインタに渡せるようになれば、
システムコールバックが使いやすくなるな
GCなしでどう実装するのか分からないが

595:デフォルトの名無しさん
10/05/05 15:26:48
また来た

596:デフォルトの名無しさん
10/05/05 23:30:16
>>578
classとstructの違いはデフォルトのアクセス性しかないのに
enum class とenum structで機能が違うのは紛らわしくね?

597:デフォルトの名無しさん
10/05/05 23:52:10
template <struct T> がエラーなのと同様、
enum struct は不許可にすべき

598:デフォルトの名無しさん
10/05/06 00:30:59
>>590
そもそもコンテナの文字列表現なんて一意に決められるものでないから、

template<class Policy, class Container> class container_io_wrapper;
template<class Policy, class Container> container_io_wrapper container_io(Container& c);

std::vector<int> v = { 1, 2, 3, 4 };
std::cout << container_io<EnumPolicy>(v) << std::endl;
// 例えば [1, 2, 3, 4] のように表示される。

みたいなラッパーを自作するだろ普通。

599:デフォルトの名無しさん
10/05/06 08:37:22
lambdaって関数の引数として渡したい場合はtemplate使うしかないの?
シグネチャが分かっててもダメなんかな。

600:デフォルトの名無しさん
10/05/06 08:49:07
シグネチャが同じってoperator()のシグネチャが同じなだけで
キャプチャした変数によって型は違うんじゃないの?

601:デフォルトの名無しさん
10/05/06 08:52:44
>>600
翻訳単位が違えば型も別になるしなぁ。
静的型付けが大前提だし、template使うしかないのか・・・

602:デフォルトの名無しさん
10/05/06 09:38:55
ていうかlambdaのoperator()ってvirtualになってないのかな?
なってなさそうだなぁ

603:デフォルトの名無しさん
10/05/06 12:03:19
ラムダ式はalgorithmと組み合わせて使う事がほとんどだろうから
virtualはあまり必要ないんじゃ?

あ、コンテナの中にBase, Derivedへのポインタが入っていた場合に欲しいか

604:デフォルトの名無しさん
10/05/06 12:09:12
>>603
うん、C++的発想だとそうなるんだけど、つまりシグネチャ決めようがねーよなって話

605:デフォルトの名無しさん
10/05/06 12:31:36
無理にやったらやったで出来ない事もないだろうが
ただでさえキモいラムダ式がさらにキモくなるな

606:デフォルトの名無しさん
10/05/06 12:39:01
そういう強引な自己満コードを見たら今後は キモダ式 と呼ぶ事にするw


607:デフォルトの名無しさん
10/05/06 13:53:03
C++0xが入るとBoostはさらにキモさをPowerUpするぜ間違いない

608:デフォルトの名無しさん
10/05/06 13:57:02
いやな、VS2010で遊んでるんだが、ラムダ式かなり使えるよホント
これでBoost::lambdaはほとんど必要なくなるな

しかし見栄えが汚いな
C#3.0の時に汚いの分かってたろうからもう少し綺麗に見栄えのする
書式にできなかったものかねえ

609:デフォルトの名無しさん
10/05/06 14:37:53
Cの関数ポインタ自体がきったねぇことを考えると
もうラムダさんの服装は無難で妥当に思えてきたよ

610:デフォルトの名無しさん
10/05/06 14:53:15
ラムちゃんの衣装は虎模様のビキニ

611:610
10/05/06 14:54:01
誤爆しました


612:デフォルトの名無しさん
10/05/06 17:46:38
VS2010のメリットはラムダさんとautoさんとdecltypeさんだけだからな
他のすべての点においてVS2008に劣っている

613:デフォルトの名無しさん
10/05/06 18:50:40
VS2010は発売後直ちに数多くのバグ報告がされているからSP1は
早めに出るかも知れない

その時にC++0xの時間が無くて入れられなかった機能を入れて欲しい(´・ω・`)

614:デフォルトの名無しさん
10/05/06 18:59:36
最初のベータから0xの機能は増えてないんだよな

615:デフォルトの名無しさん
10/05/06 19:52:03
>>612
rvalue reference の準拠文書が更新されてるってのを
Boost ML で見たような気がする。

616:615
10/05/06 19:54:16
>>612 じゃなくて >>614 だった。

617:デフォルトの名無しさん
10/05/06 20:21:29
VC2010は右辺値参照サポートしてライブラリも Move Semantics を実装してるんじゃなかったっけ?

618:デフォルトの名無しさん
10/05/06 20:22:50
別にC++0xの規格がまだ定まっていない以上、
C++0xに関するバグはどれだけあろうがしょうがないんじゃない?

ただ2010から現在のC++0x機能を除いたら何が残るのか知らんけど。

619:デフォルトの名無しさん
10/05/06 20:24:22
最早スレチだと思うけど、インテリセンスがマシになったという噂

620:デフォルトの名無しさん
10/05/06 20:45:35
C++/CLIはインテリセンス自体がなくなった

621:デフォルトの名無しさん
10/05/06 20:56:45
>>620
なるほど。確かにインテリセンスのバグはなくなったな。

622:デフォルトの名無しさん
10/05/06 23:08:42
>>608
boost::lambdaはこんなこともできる。
auto m=boost::lambda::_1*2;
auto a=m(3); //戻りはint
auto b=m(1.3); //戻りはdouble


623:デフォルトの名無しさん
10/05/06 23:31:53
>>617
std::mapとstd::tr1::shared_ptrを使ってみたけど両方共右辺値参照サポートしてるね。


624:デフォルトの名無しさん
10/05/06 23:34:07
>>619
インテリセンスはよく効くようになってきてるね。
エラーのハイライトの反映が遅いね。処理中は薄くするかステータスバーに表示して欲しいな。



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch