- C++相談室 part122 [無断転載禁止]©2ch.net
816 :デフォルトの名無しさん[sage]:2016/02/14(日) 01:45:35.51 ID:Ssn6bioA - よし最新の企画を読んだ俺が答えてやろう
クラスとクラステンプレートで宣言と定義に大差は無い template<typename T> struct a { constexpr static int N = 0; }; template<typename T> constexpr int a<T>::N;//アドレスを要求される場合必要 int main(){ f(&a<int>::N); }
|
- C++相談室 part122 [無断転載禁止]©2ch.net
818 :デフォルトの名無しさん[sage]:2016/02/14(日) 02:17:54.69 ID:Ssn6bioA - 大丈夫だ。最新の規格も読んだのでぬかりはない
だが規格よりドラフトN4567の3.2 One definition ruleの方が近い例が書かれている
|
- C++相談室 part122 [無断転載禁止]©2ch.net
820 :デフォルトの名無しさん[sage]:2016/02/14(日) 07:43:32.58 ID:Ssn6bioA - 大丈夫だ。規格は全版揃えているからぬかりはない
規格は>806の通りで最初からこの仕様はある C++98『The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition』 この時点でif it is usedが何を意味するのか説明が漏れていて(次の段落を読むと意図は想像できたが)、 C++11『if it is odr-used (3.2) in the program and the namespace scope definition』 と「odr-used」と言う言葉が導入された。これがリンカーの仕事が必要となるような使い方を意味する。 N4567では3.2のサンプルコードでstatic const int変数を const int &f(const int &r); に渡してodr-used here, so a definition is requiredとコメントが書かれている
|