2016-09-22 11 views
9

た後、非常に一般的な状況は、ここで私は実際には(私の質問のほとんどを間違いを参照してくださいconstexprの静的メンバは、前に/私の知る限り見ることができるようにC++ 17

template<int i> class Class 
{ 
public: 
    static constexpr int I = i; 
    static constexpr int J = constexprFunction(i); 
    // further Class implementation 
}; 

のようなものはほとんどとして一般的であるあります私はそれを忘れてしまったとは知らなかったので、メンバーはODR-使用されている場合は、適切な質問があったもの)、追加の定義を忘れて:

template<int i> constexpr int Class<i>::I; 
template<int i> constexpr int Class<i>::J; 

は、今私は cppreference: Definitions and ODRcppreference: static members、状態を読んで、これは廃止されていることC++の場合17。これは、多くのエラーを避けるため、私にとっては素晴らしいことです。しかし、他の質問が出てくる:

1)追加の定義を無駄にする以外の理由があるのでしょうか? (この質問の最後の段落も参照してください)

2)cppreference: static membersの最後の例では、const staticメンバーにも適用されるようですが、規則にはconstexprメンバーのみが記載されています。それはconst staticメンバーに適用されますか?

3)私が見つけたすべての例は、Class::Iのような単純な定義を使用していました - それはすべて状況のためにもClass:Jconstexprの機能で保持していますか?

C++ 17とC++ 17の前のベストプラクティスはすばらしいことでしょう。私が理解する限りでは、前もって良いコードを作るためには、前もって診断が必要ではないことが多いコードを作るでしょうから、これはすべて私にとって非常に厄介な変化のようです。その結果、コードが生成されますが、これは古いコンパイル済みコンパイラではまだ「非形式的な診断不要」ですが、odrを使用する必要がない限り、これらは不平を言うことはありません。

:Aaron McDaidが提案したテキストを修正しました。

+2

私は静的データメンバーの最後の例は編集エラー(今は修正済み)だと思います:9.2.3.2 [class.static.data] p3は、 "非揮発性非インラインconstスタティックデータメンバー"、 "メンバーはodr-usedの場合でも名前空間のスコープに定義されなければなりません " – Cubbi

+1

質問の文章では混乱しています:*"間違い...メンバーがodr-usedである場合に定義を与える "*。確かに、C++ 11では、定義に失敗するのは間違いですか?否定を忘れましたか? (申し訳ありませんが、これは非常に賢明だと思われますが、私は本当にここでその意図を確実に知るには至りません) –

+0

@AaronMcDaidはい、それは本当です。それを私が直した。私は明らかにC++ 11で追加の定義を与える必要があることを意味しましたが、これはもはやC++ 17では当てはまりません。したがって、私は最後の段落で下位互換性の目的で私の混乱を説明しようとしました。 – marlam

答えて

5

この変更は、インライン変数の提案(P0386)によるものです。 static constexprinlineを意味し、定義を冗長にします。

付録Dにおいて、次の内容で、「静的constexprのデータメンバの再宣言」を、DXを新たな副次を追加: を事前C++国際標準との互換性のために、constexprの静的データメンバは、冗長外部再宣言することができます初期化子を持たないクラスこの使用法は推奨されていません。

[例:

struct A { 
static constexpr int n = 5; // definition (declaration in C++2014) 
}; 
const int A::n; // redundant declaration (definition in C++2014) 

末端例]ご質問

について

は、この変更、追加の定義は無用作る以外の理由を持っていますか?

本質的に、それでも、それはあなたが留意したもの以外の追加の用途を持っています(question参照)。この提案は、変化するグローバルな状態の使用を奨励するかもしれないので、議論の余地があった。

const staticメンバーに適用されますか?あなたはinlineとしてそれに注釈を付けるない限り

Class:Jの場合はconstexprの場合もすべて状況を把握していますか?

はい。この提案はリンクを扱いますが、初期化ルールには影響しません。

+0

私はそれが引用であることを知っていますが、 'constexpr'を宣言し、それを' const'と定義するのはちょっと混乱しませんか?これは私と同じではないようだから... – marlam

+0

@marlamそれは私にもびっくりしました。私はそれがタイプミスだと思う。 – metalfox

関連する問題