Ansicht umschalten
Avatar von pre alpha
  • pre alpha

mehr als 1000 Beiträge seit 13.05.2006

constexpr constructor

Mir stellt sich eben die Frage, warum der Rumpf eines constexpr-constructors leer sein muĂź. Das macht irgendwie keinen Sinn, da dieses miese StĂĽck Code ja auch funktioniert:

template <size_t _Size> class Test { protected: static constexpr Test make_test(const size_t op1) noexcept { Test result; for (size_t i=0; i<_Size; ++i) result.array[i]=i*op1; return result; } public: size_t array[_Size]; constexpr Test():array{} {} //constexpr Test(const Test&)=default; // braucht man nicht mal? constexpr Test(const size_t op1):Test(make_test(op1)) {} friend std::ostream& operator<<(std::ostream& stream, const Test& test) noexcept { for(size_t i=0; i<_Size; ++i) stream<<test.array[i]<<'\t'; return stream; } }; template <size_t _Size> struct make_type { using type = std::conditional_t<_Size<=32, int32_t, long double>; }; int main(const int, const char**) { constexpr Test<10> test(7); std::cout<<test<<std::endl; using type1=typename make_type<test.array[4]>::type; using type2=typename make_type<test.array[7]>::type; std::cout<<sizeof(type1)<<std::endl; std::cout<<sizeof(type2)<<std::endl; return 0; }

Ausgabe:
0 7 14 21 28 35 42 49 56 63
4
12

Wenn ich also über make_test den Mist initialisieren kann, warum dann nicht gleich im constructor? Der Sachverhalt erschließt sich mir nicht. Die Validierung mit make_type zeigt ja auch, daß test tatsächlich constexpr ist.
Ist das evtl. nur ne Spezialität vom gcc (6.3, std=c++14) und andere Compiler fressen das nicht?

thx
pre alpha

Das Posting wurde vom Benutzer editiert (04.02.2017 23:27).

Bewerten
- +
Ansicht umschalten