Warum verliert std::initializer_list seine Konstanz, wenn es an eine Funktion übergeben wird? [Duplikat]C++

Programme in C++. Entwicklerforum
Anonymous
 Warum verliert std::initializer_list seine Konstanz, wenn es an eine Funktion übergeben wird? [Duplikat]

Post by Anonymous »

Die Übergabe eines Objekts an eine Funktion sollte meines Wissens nicht dazu führen, dass das Objekt seinen constexpr-Status verliert (eigentlich weiß ich nicht, warum dies manchmal der Fall ist oder nicht):

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

}
Link zu Godbolt
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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post