京都C++勉強会の宣伝のために、CとC++の違いを、少しづつ解説することにした。
江添とボレロ村上の京都C++勉強会が、12月16日に行われる。これを書いている時点では、まだ空きがあるので、最新のC++14の新機能と、コンパイル時レイトレーシングを勉強したければ、ATNDで参加申し込みをせよ。
江添とボレロ村上の京都C++勉強会 | 集客ならイベントアテンド
C++では、暗黙に生成されるコピーコンストラクターとコピー代入演算子は、volatileオブジェクトをコピーできない。
struct S
{
int i ;
// C++
// 暗黙のコピーコンストラクター
// S( S const & ) ;
// 暗黙のコピー代入演算子
// S & operator =( S const & ) ;
} ;
int main()
{
volatile struct S s = { 0 } ;
// Cでは合法
// C++では違法
struct S s2 = s ;
}
これは、暗黙に生成されるコピーの仮引数の型が、T const &だからだ。強い静的型付けをもつC++だから、このままではvolatileオブジェクトは受け取れない。
volatileの扱いは色々と難しく、C++では色々と議論された。
暗黙のコピーを、const volatile T &とする案は、最適化の妨げになるという理由で却下された。三種類のCV修飾されたコピーを暗黙に生成するという案は、とても複雑になり、予期しない問題を生むだろうという理由で却下された。結局、このようなコード例は少ないだろうからということで、この点ではCとは非互換になることを決定した。
江添とボレロ村上の京都C++勉強会が、12月16日に行われる。これを書いている時点では、まだ空きがあるので、最新のC++14の新機能と、コンパイル時レイトレーシングを勉強したければ、ATNDで参加申し込みをせよ。
No comments:
Post a Comment