た後、非常に一般的な状況は、ここで私は実際には(私の質問のほとんどを間違いを参照してください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 ODRと
cppreference: static members、状態を読んで、これは廃止されていることC++の場合17。これは、多くのエラーを避けるため、私にとっては素晴らしいことです。しかし、他の質問が出てくる:
1)追加の定義を無駄にする以外の理由があるのでしょうか? (この質問の最後の段落も参照してください)
2)cppreference: static membersの最後の例では、const static
メンバーにも適用されるようですが、規則にはconstexpr
メンバーのみが記載されています。それはconst static
メンバーに適用されますか?
3)私が見つけたすべての例は、Class::I
のような単純な定義を使用していました - それはすべて状況のためにもClass:J
とconstexpr
の機能で保持していますか?
C++ 17とC++ 17の前のベストプラクティスはすばらしいことでしょう。私が理解する限りでは、前もって良いコードを作るためには、前もって診断が必要ではないことが多いコードを作るでしょうから、これはすべて私にとって非常に厄介な変化のようです。その結果、コードが生成されますが、これは古いコンパイル済みコンパイラではまだ「非形式的な診断不要」ですが、odrを使用する必要がない限り、これらは不平を言うことはありません。
:Aaron McDaidが提案したテキストを修正しました。
私は静的データメンバーの最後の例は編集エラー(今は修正済み)だと思います:9.2.3.2 [class.static.data] p3は、 "非揮発性非インラインconstスタティックデータメンバー"、 "メンバーはodr-usedの場合でも名前空間のスコープに定義されなければなりません " – Cubbi
質問の文章では混乱しています:*"間違い...メンバーがodr-usedである場合に定義を与える "*。確かに、C++ 11では、定義に失敗するのは間違いですか?否定を忘れましたか? (申し訳ありませんが、これは非常に賢明だと思われますが、私は本当にここでその意図を確実に知るには至りません) –
@AaronMcDaidはい、それは本当です。それを私が直した。私は明らかにC++ 11で追加の定義を与える必要があることを意味しましたが、これはもはやC++ 17では当てはまりません。したがって、私は最後の段落で下位互換性の目的で私の混乱を説明しようとしました。 – marlam