ARTICLE AD BOX
Passing an object to a function shouldn't, as far as I know (actually I don't know why sometimes it does or doesn't), make that object lose its constexpr status:
#include <iostream> #include <cstring> template<typename T> void func(std::initializer_list<T> 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); }Why does std::initializer_list lose its constexpr status? And does it happen to other classes? And what distinguishes any such class from my MyConstExprClass class which retained it?
