Code: Select all
#include
#include
template
void func(std::initializer_list list) {
// std::initializer_list loses constexpr status
static constexpr int N = list.size();
// N must be initialized with a constant
}
struct MyConstExprClass
{
constexpr int size() const { return 0;}
};
void func2(MyConstExprClass g)
{
/* MY CLASS DOESN'T LOSE ITS constexpr'ness */
constexpr int N = g.size();
}
int main()
{
//func( { 1, 2, 3} ); // THIS DOESN'T COMPILE ON ANY COMPILER
func2(MyConstExprClass{}); // THIS COMPILES ON ALL COMPILERS
// THE FOLLOWING COMPILES ON ALL COMPILERS
static_assert(std::initializer_list{1, 2, 3}.size() == 3);
}
Warum verliert std::initializer_list seinen constexpr-Status? Und passiert es auch anderen Klassen? Und was unterscheidet eine solche Klasse von meiner MyConstExprClass-Klasse, die sie beibehalten hat?
Mobile version