Skip to content
2009/10/14 / highmt

クラステンプレートのstaticメンバ変数

cppllより。

http://ml.tietew.jp/cppll/cppll/article/8425

If D is a template, and is defined in more than one translation unit,
then the last four requirements from the list above shall apply to names
from the template’s enclosing scope used in the template definition
(14.6.3), and also to dependent names at the point of instantiation
(14.6.2).

昔テンプレートライブラリつくってたときにテストソースでリンカエラーが出て苦労した覚えがあったのだけれど、勘違いか?
今VC9で試すと確かに同一オブジェクトになっている。

このとき翻訳単位間で違う初期化子を与えてしまうのは undefined behavior らしい。
VC9では最初にインスタンス化されたところのソースの初期化子が使われるっぽい。

ODRといいHaskellの単相性制限といい、言語の隅っこのほうは苦労の後が見える。
自然な挙動になるようにがんばってるのは何もRubyだけじゃない。

広告
%d人のブロガーが「いいね」をつけました。