5

N4296、3.2 [basic.def.odr]p3:

x名前が潜在的に評価される式として表示される変数は、左辺値から右辺値への変換を適用して、自明でない関数を呼び出さない定数式を生成しない限り、exによって ODR 使用されます。左辺値から右辺値への変換が に適用されるか、または破棄された値の式である、式 の潜在的な結果のセット。exxxexeee

この段落をどう説明する?2つの説明が見つかりました。

ここから 1 「C++14 で [basic.def.odr]/2 を理解しようとしています (N4140)

これをいくつかのステップに分けてみましょう: 式 `ex` 内の変数 `x` の出現は、次の場合を除き、odr-use を構成します:
  1. ex潜在的に評価されていないか、または
  2. 次のすべてを満たす必要があります。
    1. 「左辺値から右辺値への変換を適用するxと、重要な関数を呼び出さない定数式が生成されます」 および
    2. "exは、式の潜在的な結果のセット " の要素でありe 次のいずれかが成り立ちます:
      1. "左辺値から右辺値への変換が適用されるe"
      2. または e破棄値式です」

および cppreference http://en.cppreference.com/w/cpp/language/definitionからの 2

次のいずれかが真でない限りx、潜在的に評価される式の変数exは ODR 使用されます。

  • 左辺値から右辺値への変換を適用するxと、重要な関数を呼び出さない定数式が生成されます

  • xはオブジェクトであり、 ex はより大きな式の潜在的な結果の 1 つですe。ここで、そのより大きな式は、破棄された値の式または左辺値から右辺値への変換のいずれかです。

2 つのルールについての最初の答えはandで、もう 1 つはanyです。どちらが正しいですか?

このコードを説明するには、ルールをいくつかのステップに分けてください:

struct S { static const int x = 0; };
extern S s;// no definition of s
int i = s.x;// is s odr-used? is x odr-used?
            // gcc 5.1.0 is ok
4

1 に答える 1