C ++ 14: Initialisierung von Constexpr-Variablen aus Parameterwerten

Say Ich habe eine Klasse, die einen konstanten Ausdruck durch ein @ zurückgeben kaconstexpr Funktion:

template<int N>
struct Foo {
  constexpr int Bar() const { return N; }
};

Wenn ich Constexpr-Werte von @ initialisieren wollFoo::Bar(), wie soll ich einen Parameter vom Typ @ übergebFoo? Ich habe diese beiden ausprobiert, mit einem Beispielconstexpr Variable in jedem, um zu testen, ob es initialisiert werden kann:

template<int N>
constexpr int ByValue(Foo<N> f) {
  constexpr int i = f.Bar();
  return f.Bar();
}

template<int N>
constexpr int ByReference(const Foo<N> &f) {
  constexpr int i = f.Bar();
  return f.Bar();
}

constexpr int a = ByValue(Foo<1>{});
constexpr int b = ByReference(Foo<1>{});

But clang 3.7 wirft einen Fehler aufByReference während gcc> = 5.1 nicht:Live Demo

main.cpp:15:25: error: constexpr variable 'i' must be initialized by a constant expression
      constexpr int i = f.Bar();
                        ^~~~~~~
main.cpp:22:25: note: in instantiation of function template specialization 'ByReference<1>' requested here
      constexpr int b = ByReference(Foo<1>{});

Was ist der Unterschied zwischen einemconst Foo & oder ein einfachesFoo, wannBar istconstexpr wie auch immer und gibt einen gültigen konstanten Ausdruck zurück?

Was ist richtig und warum, GCC oder Clang? Falls verfügbar, sind Verweise auf die Norm erwünscht.