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).