C++相談室 part6

このエントリーをはてなブックマークに追加
>>950
>> (a += b) += c;

でもそれって int とか基本型では保証されてないって聞いた覚えがあるぞ。気のせいか?
const CTest& operator=(const CTest& t)
const CTest& operator=(const CTest& t) const
なんつって
状態を変更するからoperator=() constはありえない
956デフォルトの名無しさん:02/05/19 09:45
//例外をthrowできない関数
void Test1() throw()
{
throw 1;//Error!
}
//例外をthrowできる関数
void Test2 throw(...)
{
throw "Test2";//Ok
}
//例外をthrowできる
void Test3() throw(int)
{
throw 1;//Ok
}
throwについて調べてるんですが、
末尾につけるthrow(...),throw()は、
プログラムのミスを避けるためのものだと思うのですが、
使わないと最適化への影響や何らかの弊害があるのでしょうか?
よろしくお願いします。
957思い出:02/05/19 09:45
class C{};

C obj_c();  //これでデフォルトコンストラクタ呼んでたと思ってた
>>956
帰ってくる例外の型を特定するための機能だよね。
959デフォルトの名無しさん:02/05/19 10:06
>>958
void Test4() throw(unsigned int)
{
throw 4;
}

void TestCatch1();
{
try{
Test2();
Test3();
Test4();
}
catch(int){//型がわかる
//Test2
}
catch(unsigned int){//型がわかる
//Test4
}
}

TestCatch2() throw()
{
try{
TestCatch1();
}
catch(...){//残り
//Test3
}
}

あいまいさを解決できるということですね。納得できました。
そういうわけでもないんだが。
呼び出し側が捕捉すべき例外を明示するための機能。
throw(unsigned int)と指定されていれば、
throw floatは成立し得ない(プログラムが落とされる
>>952
気のせいだろ。というか、その程度、ちょっとコンパイラで
確認すればいい話じゃないのか?
> (a += b) += c;
このコードは、VC6SP5 , bcc5.5.1 , gcc2.95.3-6 で
コンパイルが通って、なおかつ期待通りに計算されてたぞ。
ただ、ついでに確認したhttp://www.digitalmars.com/の
コンパイラだと、コンパイルが通ってくれなかったな。
このコンパイラがヘヴォなだけだと思うんだが…。
本格的に確認したければ、プロ言C++を見るしか。

>>953>>954
operator=()の戻り値をconstにはするな、とEffective C++に
書いてある。理由は、Scott Meyersお得意の『intのように振舞え』
だったけど。
Exceptional C++にもconstにはするな、と書いてある。こっちの理由は、
STLのコンテナに入れられなくなるから、だ。
そういうわけで、constを付けちゃいけない。
>>960
throwする側が仕様以外の例外を返さないようにする保険のようなもんじゃないの?
>>962
する側じゃなくて、される側のために用意してあるもんなんだが
>>963
まぁ、お互いのためだ。

出す側が未定義の例外投げればコンパイルエラーになるし、出される側も飛んでくる型が特定できる。
965デフォルトの名無しさん:02/05/19 10:23
もし同じ型の例外が複数きたときはどうすればいいんでしょうか?
>>965
その例外の値(intとか)クラスメンバ(Exception.typeみたいな)で判断するべし。
>>964
コンパイルエラーにはならないっしょ。例外仕様が指定されていないライブラリのために。

>>965
言ってる意味がわからん。例外は、投げるときは必ずひとつのはずだが。
968965:02/05/19 10:37
>>967
よく考えてみれば、一つですね。
>>966
例外処理クラス作ります。
uncaught_exceptionがサポートされてない処理系(VCとか)で
スタックに確保したオブジェクトのデストラクタがthrowするとか。
>>969
例外のためのアンワインド中に、スタック上のオブジェクトのデストラクタが
さらに例外を投げた場合って意味か?
その場合はいきなりプログラムがあぼーんじゃなかったっけ。
だからデストラクタでは例外を投げるなよ、といろんな本に書いてあるのでは。
971デフォルトの名無しさん:02/05/19 12:10
>>957
えっ?違うの・・・?
# ネタじゃありません・・・
ていうか
もう痔スレ立てますよ?
>>972
よろしこ。
>>972
おっと、いつのまに1000間近か…よろしく
>>971
関数宣言になっちゃう
976971:02/05/19 14:02
>>975
ナルホドサンクスコ。
v(^・^)v
グッシッシ
v(^・^)v
981    :02/05/21 00:45
v(^・^)v
v(^・^)v
v(^・^)v
v(^・^)v
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
(゚Д゚) 何見てんだゴルァ!!
v(^・^)v
996v(^・^)v:02/05/22 18:25
Boost 感動した。よくやった。
997
998v(^・^)v:02/05/22 18:27
1000 トルナラ イマノウチ
999v(^・^)v:02/05/22 18:28
キタ━━(゚∀゚)━( ゚∀)━(  ゚)━(  )━(゚  )━(∀゚ )━(゚∀゚)━━!!!!!
1000v(^・^)v:02/05/22 18:29
v(^・^)v
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。