【信者】C++の問題点【アンチ】

■ このスレッドは過去ログ倉庫に格納されています
2008/10/10(金) 09:13:53
C++の問題点について語るスレです

C++ってなんであんなに肥大化しちゃったの?
http://pc11.2ch.net/test/read.cgi/tech/1219902495/
2008/10/13(月) 00:31:04
演算子はコンパイラがすでに解釈順位を決めている。
にらそれと同じことをすればいい
2008/10/13(月) 00:31:53
>>23
まあ、俺もうまく説明できてないが、
問題点を理解できてないのに噛み付かなくてもいいよ。
2008/10/13(月) 02:18:29
>>24
で、そういうことをするプログラマーが問題ではないと
2008/10/13(月) 11:11:10
自由と責任は表裏一体。
低レベルの開発ならC並の何でもできる自由度が必要だけど、アプリよりになればなるほど勝手な振る舞いはしてほしくない。
今はハードをベタベタに触る言語とGUIやwebをらくらく使う言語と使い分ける時代じゃねーのかね。
C++は全部やろうとして、肥大化してるし、トラップも増えている感じ。

何でもできるけど、責任はプログラマ側ねという言語は必要だけどすべての分野で使うべきかどうかは疑問だね。
2008/10/13(月) 12:30:57
本当に自由な言語には使わない自由もあるだろ。
そもそもC++をすべての分野で使うべきなんて誰も言ってないのに勝手に勘違いして
GCを全否定したり無駄な継承したりするのが義務だと思い込んでるだけ。
2008/10/13(月) 12:33:54
分かってる人は分かった上でC++使ってればいいんだよ。
分からない人が「たくさん」いる現場で使うにはC++はしんどい言語だってこと。
2008/10/13(月) 12:33:56
流れを読まずにかきこ
GCって何?
2008/10/13(月) 12:35:07
分かってないのに分かった気になってる人がたくさんいる言語
2008/10/13(月) 12:36:31
Graphics Context
Grand Central
Gabage Collection
2008/10/13(月) 13:40:52
nintendo
2008/10/13(月) 15:39:46
前スレ984、少し改変

あなたは○×言語の問題点を指摘されました
1)「おまえは○×言語もわからない馬鹿だから問題じゃない!」とレッテルを貼る
2)「その問題は俺は(普通は)回避できる(使わない)から問題じゃない!」と論点を摩り替える
3)「△□言語にも同じ問題があるから問題じゃない!」と論点を摩り替える
4)「〜〜という理由でそれは問題とは言えないのではないか?」と論理的に問題無いことを証明する
5)「確かにそこには問題があるね」と素直に認める
2008/10/13(月) 16:04:48
2と4の違いはなんだ
属人性の排除とかいうやつか
2008/10/13(月) 16:30:24
2はオールマイティーだな
どんな言語・問題点だろうと普通は使わないからおkって答えればいい
2008/10/13(月) 16:36:29
包丁やナイフにも人をさせる問題があるが世界中で愛されている
2008/10/13(月) 17:02:14
ナイフなんかは問題が明らかになれば規制される物だよな
2008/10/13(月) 17:02:36
包丁やナイフは人をさせるということが予測がつくが、
C++の演算子オーバーロードや例外は想像を超えた害悪があるから問題なんでしょ。
2008/10/13(月) 17:03:43
つーか包丁は役に立つが
&&のオーバーロードは罠なだけで役に立たん
2008/10/13(月) 17:11:25
追加
6)「問題はあるけど愛されてるから無問題」と論点を摩り替える
もう何でもアリだなwww
2008/10/13(月) 17:16:17
演算子のオーバーロードは無いと困る機能でもないのに
問題を孕んでるのが嫌らしいよな。結局、無い方がいい。
2008/10/13(月) 17:27:27
>>41
演算子のオーバーロードは無いと困るだろう
2008/10/13(月) 17:28:40
演算子オーバーロード全部がまずいのではない
&& || ,
がまずいだけだ

さしあたりはな
2008/10/13(月) 17:31:09
()、->、newなんかは大活躍ですよ
2008/10/13(月) 17:31:25
>>40
論点うんぬんは関係ない
ただ根拠がいい加減なだけ
2008/10/13(月) 17:36:35
operator++()の引数はいらない子
2008/10/13(月) 17:39:00
>>44
ユーザ定義の演算子を作らなくても実現出来ると思うんだけど
2008/10/13(月) 18:07:22
そりゃそうだ。どれも関数呼び出しに還元できる。
それ言ったらどの演算子も多重定義できる必要は無い。
複素数やベクトルでa + bと書きたいのと同じようにスマートポインタではp->mと書きたい。
2008/10/13(月) 18:41:28
屋上屋ってやつか
2008/10/13(月) 18:51:31
operator->は生ポインタを隠すのに有効

と思ってたけどp.operator->()って普通に出来ちゃうのな
あまり意味がないような気がしてきた
2008/10/13(月) 19:25:06
あまり意味がないことを悟った上で使えってことじゃね
2008/10/13(月) 20:33:58
覚えたての厨房が粋がってトリッキーなオーバーロードをしないように気をつけないといけないのが面倒くさい。
2008/10/13(月) 20:43:27
>>50
そう、隠すためではなく糖衣構文を提供するためのもの。
2008/10/14(火) 05:32:02
お前らいい加減にしろよ
前スレは10年近く前のネタを1000もかけて焼き直しただけだろ
これ以上一体何を続けるつもりだ?

http://www.kh.rim.or.jp/~nagamura/misc/stroustrup-interview.html
55デフォルトの名無しさん
垢版 |
2008/10/14(火) 09:11:42
その偽ネタインタビューと現在のC++の問題点となんの関係がある?
2008/10/14(火) 09:21:25
>>55
ヒント:読んだばかり
2008/10/14(火) 10:41:05
>>55
え?ネタって書いてあるのが読めなかったの?
え?書いてある内容がどんなもんかすらわからなかったの?
え?もしかしてニホンゴワカラナイ?
2008/10/14(火) 11:14:57
>>57
日本語でおk
2008/10/14(火) 18:12:29
前スレと>>54見てこれなら、真性馬鹿はゆとりとは一味違うな
60デフォルトの名無しさん
垢版 |
2008/10/15(水) 10:02:39
横だが本気で意味わからん
真正馬鹿でもゆとりでもいいから是非日本語で詳しく解説してくれ

ちなみに前スレって一言でまとめると
「斜め上発言でアンチからフルボッコされるドM信者スレ」
だよ?
2008/10/15(水) 18:03:39
斜め上発言で信者からも「アンチからも」フルボッコされるドMアンチもいました
2008/10/15(水) 18:25:37
え?そんなの覚えないけど?
すごく興味あるから印象操作じゃないならポインタ示してね
2008/10/15(水) 22:58:32
>>60
すごく興味あるから印象操作じゃないならポインタ示してね
64デフォルトの名無しさん
垢版 |
2008/10/16(木) 10:17:02
前スレ987
>まぁ信者は問題点に納得した時点で沈黙するからなぁ
>結局新規の馬鹿信者が斜め上発言してアンチがフルボッコにするループはいくらでも続く
前スレ988
>&&批判に反発してた連中は、終わった話を何度も蒸し返して
>無駄に傷口広げてる感じだったな
>しかも禿の仕様ミスであること自体は認めているから
>まともに・論理的には反論できずに
>そんなのは些細なことで問題にするほうがおかしいとか
>斜め上の話ばかりになる
2008/10/16(木) 10:32:36
ところで、&&や||をオーバーロードすることの何が問題なの?
66デフォルトの名無しさん
垢版 |
2008/10/16(木) 18:38:55
結論から言うと、演算子オーバーロードはSTL向けの関数オブジェクト作るためだけに使え、
ということだな。
2008/10/16(木) 19:47:53
, || && は boost::spirit で活躍しているよ。
2008/10/16(木) 21:27:42
>>66
なぜそれが結論なのかが知りたいのですけど?
一体何が問題なのですか?
2008/10/16(木) 22:10:53
std::cout << "banana" << count << std::endl;

(ノ ゚Д゚)ノ ==== ┻━━┻
2008/10/16(木) 23:04:10
コンテナ継承させてよぅ
2008/10/16(木) 23:24:11
ただの質問スレだったら、protected継承でいいじゃないって答えるところだな。
2008/10/16(木) 23:49:18
>>65
組み込み型に対する&&や||は短絡といって、
左から順に評価していって、
結果が分かったらそれ以降の評価を行わない仕組みになってる。
たとえば、
bool f1(); bool f2();
if ( f1() && f2() )
という式があったとすると、f1が偽の場合、f2は評価されないことが保証される。

しかし、&&や||のオーバーロードの場合は関数呼び出しと解釈されるため、短絡がない。
それどころか、関数呼び出し順序は標準に規定されていないため、
どちらが先に評価されるかすら分からない。
my_bool b1(); my_bool b2();
if ( b1() && b2() )
この場合、b1とb2のどちらが先に評価されるか分からない(処理系依存)。

分かりにくいバグの元になる、コードの可搬性を損なう、などの理由から
&&や||のオーバーロードは推奨されない。
2008/10/17(金) 00:22:41
>>72
つまり、&&オーバーロードは、+等のオーバーロードとは違う解釈で実行されるってことなの?
それなら、大きな問題だなぁ...
2008/10/17(金) 00:26:31
>>組み込み型に対する&&や||は短絡といって、

それと同じ構造にすればいいだろ
2008/10/17(金) 00:29:42
>>74
C#とかそれを目指している。
C++でもBoost.Lambdaは頑張った。

あと今から同じ構造になる仕組みをC++に持ち込んだとしても、
「互換性のため」現状の&&と||もそのまま残ること間違いない。
2008/10/17(金) 01:43:05
比較的どうでもいい豆知識だな
2008/10/17(金) 01:51:46
遅延評価の考え方がどうでもいい豆知識っすか
Cにどっぷりはまるとそうなっちゃうのね
2008/10/17(金) 02:33:00
短絡評価 short-circuit evaluation と遅延評価 lazy evaluation はまったくの別物だぞ
遅延評価は、必要になるまで変数の値の計算を先延ばしにするHaskellのアレだ
2008/10/17(金) 02:37:48
同じ様なもんだろ
右オペランドを遅延評価することを短絡評価という
80デフォルトの名無しさん
垢版 |
2008/10/17(金) 02:44:31
じゃあ遅漏評価は?
2008/10/17(金) 03:07:21
>79
遅延評価はもっと広い意味の言葉だから混同するとややこしい。
2008/10/17(金) 08:55:24
>>64
何の指摘にもなってないよ
83デフォルトの名無しさん
垢版 |
2008/10/17(金) 09:10:07
オーバーロード関数のDLLが・・・
2008/10/17(金) 09:13:17
>>83
日本語でok
2008/10/17(金) 10:40:56
オーバーロードしたら&&が論理和どころか論理演算ですらある必要がないので、
通常と同じ動作にしたらいいじゃんという主張は無意味だろ。
2008/10/17(金) 11:07:09
演算子の元の意味と大きく異なるオーバーロードは駄目だろ
おまえは+が加算である必要が無いからって乗算にするのか?
2008/10/17(金) 12:04:19
> 演算子の元の意味と大きく異なるオーバーロードは駄目だろ

そこで << ですよ
2008/10/17(金) 12:10:38
>>72
良く分からんが
if ( b1 && b2 )

if ( b1.operator&&(b2) )
と等価じゃないの?
2008/10/17(金) 13:09:18
常識という眼鏡で僕達の世界はのぞけやしないのさ
夢を忘れた古いプログラマーたちよ

アンドじゃないアンドじゃない
素敵な世界
2008/10/17(金) 15:03:38
>>88
operator&&() が my_bool のメンバならね。
でも
    bool operator&&(const my_bool& a, const my_bool& b)
かも知れない。
更に、b1 が左辺値ではなく my_bool を戻す式だったとき、
やっぱり b2 とどっちが先に評価されるかは判らない。
2008/10/17(金) 16:06:02
>>90
引数の評価順を重要視する意味がよくわからん
引数の時点で、真偽がわかったとしても関数から抜け出す手段は無いとおもうが?

b1 && b2 && b3
の式の場合
operator&&(operator&&(b1, b2), b3)
となって、operator&&(b1, b2)が偽の場合でも、一番外側のoperator&&()が実行されるから嫌だって事なら、ちょっとだけ理解できるかもしれないが
だからと言って、C++の欠陥だと大声で言うようなものでも無いと思うのですが
2008/10/17(金) 16:52:03
>>91
短絡評価のメリットが解らない、ってこと?
2008/10/17(金) 17:17:31
>>92
短絡評価のメリットを受けられるほど長い論理式を使うつもりなのですか?
それとも、短絡評価のメリットを受けられるほどのif文の山を築く気ですか?
2008/10/17(金) 17:41:19
話がまた斜め上の方向に捩れてるな

>>91
if 式 文
で式の内容如何によらず文が評価されていいと思ってるのか?
遅延評価無しではif文を関数化することは出来ない
だから禿も?:はoperator化していない
にもかかわらず、同様の機能を持っている&&や||をoperator化しているのが
マヌケだという話だろ

>>93
言語仕様の問題をプログラミングスタイルの方向に摩り替えたい人発見
2008/10/17(金) 18:00:57
バグの原因は小さいものだから
大きな問題ではないと考えるのも無理はない
2008/10/17(金) 18:05:33
INT i=1,j=1; //なんかint的なクラスだと思いね

i++ || j++;
cout << i << "," << j;

||がオーバーロードされていなければ「2,1」が表示される
されていれば「2,2」が表示される



open(file) && abort();

&&がオーバーロードされていなければ、ファイルオープンに成功すれば処理が続行される
されていればファイルオープンに成功したのに異常終了する
2008/10/17(金) 18:32:16
>>94
論理式は論理式だろ?
if文や三項演算子とは関係ないんじゃない?

>>96
むしろ、その使い方が、言語仕様の悪用だと思います
2008/10/17(金) 18:46:18
>>97
いや、ショートサーキットの&&や||はifの変種みたいなもんだぞ
C/C++に引きこもっているうちは分からないかもしれないが、
他の言語もやってみれば分かるよ
2008/10/17(金) 18:52:24
つーか短絡評価しないなら&や|だけでいい
何のためにわざわざ&&や||が用意されてると思ってるんだ
2008/10/17(金) 18:54:39
>>99
それもちょっと違うけどな
1 && 2は真だけど 1 & 2は0だし
2008/10/17(金) 18:55:39
そうだな
ごめんアホなこと言った
2008/10/17(金) 19:44:48
>>98
論理式が返すのは、論理値だろ
論理式の処理過程を期待してプログラムするってのは、真値が特定の値である事を期待してプログラムするのと同じじゃん
2008/10/17(金) 19:50:03
>>102
そうだよ、一部ではもはやただの論理式ではなく制御構造と見なされているということ。
C++ではあまり見ないけど、PerlとかでHogeHoge or dieとか。
2008/10/17(金) 19:50:39
>>102
>論理式の処理過程を期待してプログラムする

「期待」じゃなくてC/C++は「仕様で」「明確に」「わざわざ」評価順を
定義しているわけだが
&& || に関してはな
何の意味も無くそんな仕様にしてると思ってんの?

ま、&&や||は論理演算、bool代数だよな?そこはその通りだ。
フローコントロールもセマンティクスも変えちまう
オーバーロードなんてもってのほかだよな?
2008/10/17(金) 19:59:18
bool banana;

if(!banana)
{
// ↑気持ち悪いねこれ。
}
2008/10/17(金) 20:01:54
if(true != banana)
if(false == banana)

好きなほうを選べ
2008/10/17(金) 20:02:26
VB.NETではVBには無かった短略評価の
AndAlso OrElse という(キモい)演算子が追加されているのだが
その意味も分からないんだろうねえ
2008/10/17(金) 20:10:39
>>104
言ってることがわからない
&&や||をオーバーロードできるように定義しているのも「仕様」なんじゃないの?
2008/10/17(金) 20:12:51
>>108
だから、その仕様が不整合で良くないっつー話をしてるんだろ
言うまでも無く後から突っ込んだオーバーロードの仕様がマズい
2008/10/17(金) 20:19:03
&&や||をオーバーロードの場合はコンパイラが短絡すればいいだけだろ
2008/10/17(金) 20:27:57
何だそれ
互換性が無くなってさらにカオスになるだけじゃねえか
2008/10/17(金) 20:31:27
&&と||の意味がわかんねー奴はC++厨気取りたいんなら
More Effective C++ぐらい嫁
2008/10/17(金) 20:36:52
.front()も.begin()も同じで良いジャン
なんで違うの
2008/10/17(金) 20:48:12
>>113
hoge.front()は*hoge.begin()相当。
強いて言えば、beginからfrontは取り出せるが逆は一般にできないんでfrontがやや余計かな。
2008/10/17(金) 20:52:08
front取り忘れたのかね
2008/10/17(金) 21:20:33
map持っていて

<<でkeyを流し込んだら valueが返ってくるクラスはあり?
2008/10/17(金) 21:29:44
演算子でやる理由がわからん
2008/10/17(金) 21:46:28
>>116
[]演算子で標準装備してない?
まあこれはkeyを持ってなかったらvalueにはデフォルトコンストラクタで生成
した値が代入されてしまうんだけど
2008/10/17(金) 21:51:59
[]だとポインタのとき面倒じゃね?
2008/10/17(金) 21:54:05
value = (*hogemap)[key]
でおけ
2008/10/17(金) 21:58:28
あえて operator()
2008/10/17(金) 22:39:11
ttp://homepage2.nifty.com/well/Operator.html#arrow_ast



なんでもあり
2008/10/17(金) 23:04:00
>>119
いやポインタに対して使うときは全部だろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。