2015-12-25 1 views
7

rの宣言にconstexpr指定がないため、以下のコードはGCC 5.3.0でコンパイルされません。GCCはこの参照宣言のconstexpr指定子を要求していますか?

const int i = 1; 
const int& r = i; 
constexpr int j = r; 

私は拒絶反応が正しいと考えます。作業草案N4527を使用してそれを証明するにはどうすればよいですか?

+0

さて、このコード[_does_打ち鳴らすと共にコンパイル(http://coliru.stacked-crooked.com/a/6944ddade600d0d5)。 – cpplearner

答えて

10

まず、参照を使用しているため、[expr.const] /(2.9)に違反してはいけません。 (2.9.1)はいえ、適用:参照が先行する初期化と いずれか
がない限り変数または 参照型のデータメンバーを指す

ID発現 - それがで初期化されます定数式

e初期化子-i - が定数式である限り、rを使用しても問題ありません(これは以下に示されています)。
3行目の1-t-r変換が合法であるかどうか、つまり(2.7)を違反してはならないかどうかを確認する必要もあります。しかし、(2.7.1)が適用されます。

左辺ツー右辺値それは
に適用されていない限り、変換(4.1) - 完全非指す一体または列挙タイプの 不揮発glvalue非ある - (g)の左辺値がrであり、そしてそれはiを指すのですなわち、同様に結構ですので...定数式、または

で初期化前の 初期化とconstオブジェクト、-volatile volatile式const定数式を持つオブジェクトイニシャライザ(1)。

iが実際には定数式であることを示していましたが、いったんそれが途方もないときは、が定数式であることを示す必要があります。それに
[expr.const]/5属する:

定数式値として 定数式(許可の結果であるエンティティを指すglvalueコア定数式 のいずれかであります)以下に定義される、又はその値prvalueコア定数 発現が目的である場合、そのオブジェクトとその サブオブジェクトのための:

  • 参照型の各非静的データメンバーであるエンティティを指し許容された定数式の結果であり、
  • オブジェクトまたはサブオブジェクトがポインタ型であり、静的記憶期間を持つオブジェクトのアドレスを含み、アドレスが を超えた場合、そのオブジェクトの末尾(5.7)、関数、またはNULL ポインターの値です。それは一時的なオブジェクト ないか、またはその値が上記の制約を満たす一時的なオブジェクトである静的記憶域期間を持つオブジェクトであるか、またはそれがある場合

エンティティは定数式の許可結果であります 機能です。

iであるので、上記状況において、(g)の左辺値は、それが定数式の許可結果でなければならない - それは静的記憶域期間を有するので、それは確かに一時的ではありません。したがって、iは定数式です。

rは、3行目の値として扱われます。がコア定数式であることを既に確認しているので、箇条書き点を確認する必要があります。彼らは明らかに満たされている。コードは名前空間スコープでよく形成されているよって

iは、もはや定数式の許可された結果ではないため、ローカルスコープにはなりません。 Clang gives a comprehensive error message

+1

まだ 'r'が定数式で初期化されていることを証明する必要があります。 'i'が定数式であることを示すために、' i'の値が§5.20/ 5に従って定数式の許可された結果である実体を参照することを証明しなければなりません。 – Belloc

+0

@Bellocそれはほとんど自明ではないので、私の答えではありません。 – Columbo

+1

それは私にとってではなく、あなたにとっては些細なことかもしれません。 – Belloc

関連する問題