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.