C++相談室 part80

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2010/05/09(日) 19:57:12
const_castよりもmutableですよ。キャッシュ値を保存するのにmutableは便利。
953デフォルトの名無しさん:2010/05/09(日) 20:09:13
STLとかBOOSTで使う関数オブジェクトってあるじゃないすか
あれって関数オブジェクトを引数に受け取るときはconst参照じゃなくてオブジェクトの複製になってるのは規格や規則で指定されてるんですか?
自分でファンクタを作るときにどっちを前提で書けばいいのか迷ったので質問しました
954デフォルトの名無しさん:2010/05/09(日) 20:12:12
ああいうのは純粋関数のはずだから状態を持ってないわけで
それならconstも何もないってことなんじゃないの?
955デフォルトの名無しさん:2010/05/09(日) 20:13:35
>ああいうのは純粋関数のはずだから
どういうこと?
956デフォルトの名無しさん:2010/05/09(日) 20:14:55
>>953 標準ライブラリの話であれば規格で定められているとおり。
957デフォルトの名無しさん:2010/05/09(日) 20:17:34
>>955
結果が引数のみに依存する関数ってこと
内部状態を持ってる関数だとアルゴリズムに渡したときおかしなことになるから
958デフォルトの名無しさん:2010/05/09(日) 20:19:17
mutable使った事ない。
便利なのは知っているが、そのシチュエーションに遭遇したことがない。
959デフォルトの名無しさん:2010/05/09(日) 20:24:48
>>956
thxです
960デフォルトの名無しさん:2010/05/09(日) 20:28:04
mutableって他で代用出来なくて効果的な使い方なんてあるのか?
961デフォルトの名無しさん:2010/05/09(日) 20:32:31
複雑な計算をして得られる値を使い回したいけど
最初にその値を取得するconstメンバ関数を読んだ時に初めて計算して欲しい時とか
962デフォルトの名無しさん:2010/05/09(日) 20:33:07
mutableはC++を学び始めた時に「何に使うんだこれ」と思っていたが、今でも同じ事を思う。
963デフォルトの名無しさん:2010/05/09(日) 20:34:36
インスタンスの内部キャッシュを作ろうとするとmutableにせざるを得ない。
あとは参照カウントとか。
964デフォルトの名無しさん:2010/05/09(日) 20:37:32
>>958 こんな使い方
キャッシュなど呼び出し側からはオブジェクトの変更を意識する必要が無い場合とか。
const_castを駆使するより、constでも値を変えることができる事を明示するぐらいのメリット。

class hoge
{
mutable bool cached;
mutable int cachevalue;
public:
hoge()
:cached(false)
{
}
int getValue()const
{
if(!cached)
{
cachevalue=func();//すごい遅いけど同じ値が帰ってくることが分ってる関数。
cached=true;
}
return cachevalue;
}

};
965デフォルトの名無しさん:2010/05/09(日) 20:39:51
CRITICAL_SECTIONにmutable付けてみた
966デフォルトの名無しさん:2010/05/09(日) 20:40:33
意外と使いどころあるな
実際そんな使わないけど
967958:2010/05/09(日) 20:40:42
>>964
丁寧にありがとう!
ただ、それって単にmutableとメンバ関数のconst指定を消したらダメなのですかい?
・・・あ、それだと
void foo(const hoge&)
に渡せないってことか。
968デフォルトの名無しさん:2010/05/09(日) 20:41:28
boost::mutexなんかmutableをつけてるぜ俺
969デフォルトの名無しさん:2010/05/09(日) 20:41:46
http://codepad.org/xASzkIWx

mutableいらなくないっすか?
970デフォルトの名無しさん:2010/05/09(日) 20:42:53
getValue自体オブジェクトの状態を変更するような関数じゃないからな
constなのが自然
971デフォルトの名無しさん:2010/05/09(日) 20:44:15
ここらでだれか次スレたのむ
972デフォルトの名無しさん:2010/05/09(日) 20:44:28
>>969
おまいはいちいちmutable回避のためだけに、普段からそんなコードを書いてるのかと小一時間問い詰めたい。
973デフォルトの名無しさん:2010/05/09(日) 20:44:50
>>969
mutableだとキーワードひとつで済む上、目的が一目瞭然なのがメリット
974デフォルトの名無しさん:2010/05/09(日) 20:46:21
そんな遠回しなことしなくても、const_cast すれば代入は出来るだろ
気持ち悪いからやらないけど
975デフォルトの名無しさん:2010/05/09(日) 20:52:03
mutableよりconst_castの方が遠回しだろw
976デフォルトの名無しさん:2010/05/09(日) 20:52:55
どうせなら特定のメンバからのみ変更可能とかにして欲しいわ
他のメソッドからうっかりアクセスして壊れたらどうすんだよ
977デフォルトの名無しさん:2010/05/09(日) 20:53:29
>>974 const_cast で代入はダメだよ。未定義動作の可能性が出てくるだろ。
978デフォルトの名無しさん:2010/05/09(日) 20:54:00
メンバへの代入だから未定義動作にはなんないだろ
979デフォルトの名無しさん:2010/05/09(日) 20:54:49
>>977
const_castの対象がメンバ変数なら
設計の段階でconstじゃない事はわかりきっているから、
未定義の動作にはならないのでは・・・?
980デフォルトの名無しさん:2010/05/09(日) 20:55:20
mutableってマイナーなキーワードかと思ってたけどすごい人気だな。
981デフォルトの名無しさん:2010/05/09(日) 20:58:50
0x学園が興味を持ったようです
982デフォルトの名無しさん:2010/05/09(日) 20:59:52
0xでmutableって言うと
ラムダでキャプチャした変数を変更したい時に使うというあれか
983デフォルトの名無しさん:2010/05/09(日) 20:59:58
mutableは今現在でも仕事はあるが、
export, registerあたりは全く仕事してないと言って良いから
何か有用な使い道を考えてくれ誰か、
984デフォルトの名無しさん:2010/05/09(日) 21:01:05
registerとか管理クラス作るときその名前使わせろ糞がって思うわ
985デフォルトの名無しさん:2010/05/09(日) 21:02:11
exportは0xでめでたくリストラされました
予約語としては残るが
986デフォルトの名無しさん:2010/05/09(日) 21:04:10
registerも0xでdeprecatedになったな
予約語としては残るが
987デフォルトの名無しさん:2010/05/09(日) 21:04:22
>>985
むしろ新たな旅立ちと考えるべきでは。
何に使うのか知らんが、きっと良い案を誰かが考えてくれる。
988デフォルトの名無しさん:2010/05/09(日) 21:15:09
autoタンみたいに再就職先が見つかるといいんだが
989デフォルトの名無しさん:2010/05/09(日) 21:19:28
autoタンは再就職先どころかそっちが
もう本業になっちゃってるよな。
990デフォルトの名無しさん:2010/05/09(日) 21:19:38
>>978-979 クラスでもユーザーが const なインスタンスを作った場合には未定義動作になる。
991デフォルトの名無しさん:2010/05/09(日) 21:21:29
>>984
激しく同意
992デフォルトの名無しさん:2010/05/09(日) 21:22:50
結局const_cast後代入していいのはどういうときなのですか?
993デフォルトの名無しさん:2010/05/09(日) 21:23:33
次スレ立てるからちょっと待て。
994デフォルトの名無しさん:2010/05/09(日) 21:24:31
おk待つ
995デフォルトの名無しさん:2010/05/09(日) 21:24:47
>>992
「結局」どころかこの場にいるほぼ全ての人が
最初から知っていることだが。

大丈夫なのは元がconstじゃないのにconst属性が付いている時。

>>942の例のコードでわかるんじゃね。
996デフォルトの名無しさん:2010/05/09(日) 21:26:17
コンパイル時定数以外なら規格上は代入して良かったんじゃなかったっけ
コンパイル時定数以外の定数もだめなんだっけ?
997デフォルトの名無しさん:2010/05/09(日) 21:27:01
998992:2010/05/09(日) 21:27:32
待てというのに。

次スレ
http://pc12.2ch.net/test/read.cgi/tech/1273407971/

テンプレは今から貼る。
999デフォルトの名無しさん:2010/05/09(日) 21:31:12
うめ
1000デフォルトの名無しさん:2010/05/09(日) 21:32:50
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。