Effective C++ 読書会 Vol.1 に行ってきた

C++ の名著,Effective C++ の読書会パート1に行ってきました.
具体的には,Effective C++ の各項に沿って怖い人達が熱く語る感じの内容でした.
3項までしか進まなかったんですが,2時間ほどかなり濃い内容で楽しめました.

id:uskz さんと id:Cryolite さんの odr-violation についてのやりとりが一番盛り上がったように感じているのですが,勉強不足で id:Cryolite さんの主張がいまいち理解できなかったのでスルーして,その他に気になった箇所をメモ.

3項 戻り値型への const

Effective C++ では参照型の戻り値に const を付けていましたが,C++11 ではムーブを阻害してしまうためよくないようです.これは以前 Twitterid:gintenlabo さんがおっしゃっていたような気がします.
しかし,そうすると mutable な参照を戻してしまい,それはそれでよくないのですが,それを防ぐ機能はまだ実装中とのことでしばらくは我慢しなければならなさそうです.

4項 ローカルでない静的オブジェクトの宣言

ローカルでないスコープで

static const MyDouble md = 1.0;

例えば MyDouble をユーザ定義型として,こう書くと dynamic initialization により,main() よりも手前で初期化される保証が無いという問題です.
Effective C++ では static なローカル変数への参照を返す関数を作るなどして対処していましたが,C++11 では

static constexpr MyDouble d = 1.0;

で OK だと初めて知りました.
N3337 を見てみたところ,3.6.2 に記述がありました.
constexpr を付けると Constant initialization を明示的に指定したことになり,dynamic initialization ではなく static initialization が呼ばれるようで,上記のような問題はなくなります.
ただし,この場合,ユーザ定義型 MyDouble はリテラル型でなければいけません.


Effective C++ は名著ですが,やはり古くなっていることは否めないようで,Effective C++11 の登場が待たれます.
そのあたりは id:Cryolite さんがスコット・メイヤーズに活を入れて頂けるとのことなので期待しております.

本日は参加者の皆様ありがとうございました.