2011-11-08 13 views
5

volatileオブジェクトが非volatileメンバ関数を呼び出せないのはなぜですか?揮発性オブジェクトが不揮発性メンバ関数を呼び出すことができない理由

constの場合には、非constメンバ関数を呼び出すと、オブジェクトのconst性に違反するという意味になり、従って、それが禁止されています。しかしなぜの場合volatileの場合?

+1

あなたは揮発性の正しさを侵害しようとしているので... –

+2

とアナグラムを見つけたばかりです。 –

答えて

4

constの場合、非constメンバ関数を呼び出すと、オブジェクトのconstanceが違反することになり、禁止されます。しかし、なぜ揮発性の場合には?

揮発性の場合とまったく同じです。揮発性とは、オブジェクトへのアクセスがすべて目に見える副作用であり、排除できないことを意味します。揮発性オブジェクトに対して不揮発性メソッドを呼び出した場合は、このプロパティに違反します(不揮発性メソッドはオブジェクトを通常オブジェクトと同様に扱うため)。したがって、不可能です。

2

volatile修飾子は、constと同じように動作します。 をご覧になるには、を実行してください。this Alexandrescu articleをご覧ください。 その記事ではの理由についての洞察も得られるはずです。標準から

+0

これは2001年の記事です。重要なセクション/マルチスレッドの目的ではvolatileに関するアドバイスをしています。 。たとえば:https://www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive – Nikko

+0

@ニッコ:その答えで参照されている記事のタイトル以上を読んでください。 *完全な記事を読んでください。 – ybungalobill

4

7.1.5.1。 不揮発性のquai​​lified型の左辺値を使用してvolatile-quailified型で定義されたオブジェクトを参照しようとすると、プログラムの動作は未定義です。

私はあなたのコンパイラが未定義の動作を防ぐためにエラーを投稿していると推測しています。それを示す理由は十分な理由があるはずです。

+0

私は質問が "なぜ"であると思います –

+0

仕様から素晴らしい発見。 – iammilind

+0

@ TomalakGeret'kal標準でそう言っているので: –

関連する問題