const_castよりもmutableですよ。キャッシュ値を保存するのにmutableは便利。
STLとかBOOSTで使う関数オブジェクトってあるじゃないすか
あれって関数オブジェクトを引数に受け取るときはconst参照じゃなくてオブジェクトの複製になってるのは規格や規則で指定されてるんですか?
自分でファンクタを作るときにどっちを前提で書けばいいのか迷ったので質問しました
ああいうのは純粋関数のはずだから状態を持ってないわけで
それならconstも何もないってことなんじゃないの?
>ああいうのは純粋関数のはずだから
どういうこと?
>>953 標準ライブラリの話であれば規格で定められているとおり。
>>955 結果が引数のみに依存する関数ってこと
内部状態を持ってる関数だとアルゴリズムに渡したときおかしなことになるから
mutable使った事ない。
便利なのは知っているが、そのシチュエーションに遭遇したことがない。
mutableって他で代用出来なくて効果的な使い方なんてあるのか?
複雑な計算をして得られる値を使い回したいけど
最初にその値を取得するconstメンバ関数を読んだ時に初めて計算して欲しい時とか
mutableはC++を学び始めた時に「何に使うんだこれ」と思っていたが、今でも同じ事を思う。
インスタンスの内部キャッシュを作ろうとするとmutableにせざるを得ない。
あとは参照カウントとか。
>>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;
}
};
CRITICAL_SECTIONにmutable付けてみた
意外と使いどころあるな
実際そんな使わないけど
967 :
958:2010/05/09(日) 20:40:42
>>964 丁寧にありがとう!
ただ、それって単にmutableとメンバ関数のconst指定を消したらダメなのですかい?
・・・あ、それだと
void foo(const hoge&)
に渡せないってことか。
boost::mutexなんかmutableをつけてるぜ俺
getValue自体オブジェクトの状態を変更するような関数じゃないからな
constなのが自然
ここらでだれか次スレたのむ
>>969 おまいはいちいちmutable回避のためだけに、普段からそんなコードを書いてるのかと小一時間問い詰めたい。
>>969 mutableだとキーワードひとつで済む上、目的が一目瞭然なのがメリット
そんな遠回しなことしなくても、const_cast すれば代入は出来るだろ
気持ち悪いからやらないけど
mutableよりconst_castの方が遠回しだろw
どうせなら特定のメンバからのみ変更可能とかにして欲しいわ
他のメソッドからうっかりアクセスして壊れたらどうすんだよ
>>974 const_cast で代入はダメだよ。未定義動作の可能性が出てくるだろ。
メンバへの代入だから未定義動作にはなんないだろ
>>977 const_castの対象がメンバ変数なら
設計の段階でconstじゃない事はわかりきっているから、
未定義の動作にはならないのでは・・・?
mutableってマイナーなキーワードかと思ってたけどすごい人気だな。
0x学園が興味を持ったようです
0xでmutableって言うと
ラムダでキャプチャした変数を変更したい時に使うというあれか
mutableは今現在でも仕事はあるが、
export, registerあたりは全く仕事してないと言って良いから
何か有用な使い道を考えてくれ誰か、
registerとか管理クラス作るときその名前使わせろ糞がって思うわ
exportは0xでめでたくリストラされました
予約語としては残るが
registerも0xでdeprecatedになったな
予約語としては残るが
>>985 むしろ新たな旅立ちと考えるべきでは。
何に使うのか知らんが、きっと良い案を誰かが考えてくれる。
autoタンみたいに再就職先が見つかるといいんだが
autoタンは再就職先どころかそっちが
もう本業になっちゃってるよな。
>>978-979 クラスでもユーザーが const なインスタンスを作った場合には未定義動作になる。
結局const_cast後代入していいのはどういうときなのですか?
次スレ立てるからちょっと待て。
おk待つ
>>992 「結局」どころかこの場にいるほぼ全ての人が
最初から知っていることだが。
大丈夫なのは元がconstじゃないのにconst属性が付いている時。
>>942の例のコードでわかるんじゃね。
コンパイル時定数以外なら規格上は代入して良かったんじゃなかったっけ
コンパイル時定数以外の定数もだめなんだっけ?
998 :
992:2010/05/09(日) 21:27:32
うめ
1000
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。