- C++相談室 part121 [無断転載禁止]©2ch.net
53 :デフォルトの名無しさん[sage]:2015/12/06(日) 10:30:17.18 ID:7Za5T0R3 - >>45
bar が受け取った a を指すポインタを const_cast して中身を書き換えても 書き換えられる a は const object ではないので、 >>52 の挙げた 7.1.6.1 のルールには 違反しない。コンパイラはそういったコードによる書き換えも想定する必要がある。 >>46 の場合に同じことをすると、 a は const object なので、 7.1.6.1 のルールに違反し、 未定義動作になる。コンパイラはそういったコードを想定する必要は無い。 つまり bar(&a) 呼び出しの後も a が 1 であると仮定してよい。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
59 :デフォルトの名無しさん[sage]:2015/12/06(日) 11:51:57.90 ID:7Za5T0R3 - >>58
gcc でも >>46 のコードなら2回目が定数 1 の出力になるよ。 https://goo.gl/yHHPLm
|
- C++相談室 part121 [無断転載禁止]©2ch.net
65 :デフォルトの名無しさん[sage]:2015/12/06(日) 13:39:53.67 ID:7Za5T0R3 - >>63-64
> barが外部ライブラリとかでソースが分からない場合const修飾してるからって > ポイント先が書き換わらないと思っちゃいけないわけだ。コンパイラだけじゃなくて >. 呼び出す側を書くプログラマも。 んなこたーない。 単に const int* を外部から受け取る関数では、それが実際に const object かどうか 判別する方法が無いんだから、結局のところ書き換えてはいけない。 const int* (および参照)を受け取っておいて書き換えるような関数にこそ明示的な ドキュメントが要るし、ドキュメントがあったところでクソなインターフェースと言っていい。 何かしらの根拠によりポインタが指している先が const object ではないことがわかる、 あるいは知っている場合には const_cast を通しての書き換えも使える。 たとえば、昔ながらのコールバック関数に汎用引数 const void* を渡せる機構が付いてて、 特定コールバック内ではその汎用引数が非 const オブジェクトを指していると知っている場合、 とかね。
|
- 音声合成プログラムを作りる
380 :片山博文MZ ◆T6xkBnTXz7B0 []:2015/12/06(日) 13:56:32.76 ID:7Za5T0R3 - FM音源のLFO設定がわからない
http://teratail.com/questions/21704 OpenAL + ALUTと、ciscさんのFM音源「FM Sound Generator」を使って、 自作のBASIC環境用の音を実現しようとしています。 http://github.com/katahiromz/fmgon/blob/master/soundplayer.cpp http://github.com/katahiromz/fmgon UFOが遠ざかる音色(@16)で、カエルの歌を演奏するプログラムですが、 LFOが設定されていないので、音にひずむようなエコーがかかっていません。 音源に対してこの音色のLFOを設定する方法を教えて下さい。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
70 :デフォルトの名無しさん[sage]:2015/12/06(日) 14:13:33.39 ID:7Za5T0R3 - >>66
伝わってないみたいだからもっかい言うね。 何の前提も無ければ const ポインタor参照の指す先を書き換えてはいけない。 const_cast を通した書き換えをコンパイラが考慮しないといけないのは、書き換えが 可能となるような「前提」があるのか無いのか、プログラマがその前提を利用しているかどうかを 判別できないから。 const ポインタor参照で引数を受け取る関数について、それらを通した書き込みを 使う側が想定しなければならない、などということはない。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
75 :デフォルトの名無しさん[sage]:2015/12/06(日) 14:53:08.74 ID:7Za5T0R3 - >>72
それがコンパイラの解釈の範囲。 でもプログラマは、たとえば bar() が foo() とは無関係の関数であり呼び出し元コードに ついて何の想定も置けないことを知っていれば、 bar() 内で書き換えは行われないと想定できる。 さもないと、本当に const なオブジェクトを渡したときに未定義動作になるからね。 コンパイラは各関数を誰が書いてるか、どんな範囲で使えるものかなんて知らないなから、 そういった想定はできない。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
76 :デフォルトの名無しさん[sage]:2015/12/06(日) 14:56:53.23 ID:7Za5T0R3 - >>74
ごめん。「それは通じない」の「それ」が何を指しているのかわからない。 最後の「駄目」も何を指していってるのかわからない。
|
- C++相談室 part121 [無断転載禁止]©2ch.net
79 :デフォルトの名無しさん[sage]:2015/12/06(日) 15:05:52.33 ID:7Za5T0R3 - >>77
コンパイラが >>45 のケースで2回目のメモリからのロードを最適化で消せないのはわかってる。 >70 はプログラマが同じように値の変更を想定すべきかどうかという話で、元は >>63 が プログラマも同じ想定をするべきだ(想定しないでいいためにはドキュメントが要る)と言っていたところ、 それは現実とは違うというのを説明しているところ。
|