Ist das folgende C++ 14/C++ 1y-Programm gemäß dem aktuellen Entwurf schlecht formatiert?C++ 1y/C++ 14: Zuweisung zu einem Objekt außerhalb seiner Lebensdauer ist in einem konstanten Ausdruck nicht erlaubt?
#include <cstddef>
template<typename T, size_t n>
struct literal_array
{
T data[n];
};
template<typename T, size_t n, size_t m>
constexpr literal_array<T, n+m> operator+(literal_array<T, n> a,
literal_array<T, m> b)
{
literal_array<T, n+m> x;
for (size_t i = 0; i < n; i++)
x.data[i] = a.data[i];
for (size_t i = 0; i < m; i++)
x.data[n+i] = b.data[i];
return x;
}
int main()
{
constexpr literal_array<int, 3> a = { 1, 2, 3 };
constexpr literal_array<int, 2> b = { 4, 5 };
constexpr auto c = a + b;
}
Clang Stamm (zum Zeitpunkt des Schreibens) ergibt:
error: constexpr variable 'c' must be initialized by a constant expression
constexpr auto c = a + b;
^ ~~~~~
assignment to object outside its lifetime is not allowed in a constant expression
x.data[i] = a.data[i];
^
in call to 'operator+({{1, 2, 3}}, {{4, 5}})'
constexpr auto c = a + b;
^
Was es bedeutet, "Zuordnung außerhalb seiner gesamten Lebensdauer Objekt"? Die Lebensdauer von x und seinen Unterobjekten schließt die Funktion ein, worum geht es also?
Wenn wir das Problem vereinfachen, indem wir die Funktion nicht-Vorlage machen, macht die Fehlermeldung mehr Sinn, siehe [live] (http://coliru.stacked-crooked.com/a/a13b63215578d063). –
Ich habe einen Fehlerbericht eingereicht und er erhielt eine Antwort, siehe meine aktualisierte Antwort. –