Is it possible to return a std::initializer_list from a function?

1k Views Asked by At

The following works:

struct A {
    int i;
    int v;
};

std::initializer_list<A> getList() {
    return {A{0,1}, A{2,3}};
}

int main() {
    auto list = getList();
}

I can verify that the contents of list is correct.

However, if I change the member v to a std::vector, it does not work:

struct A {
    int i;
    std::vector<int> v;
};

std::initializer_list<A> getList() {
    return {A{0,{1,2}}, A{3,{4,5}}};
}

in this case, the returned list contains junk values.

I know the standard says that the underlaying objects are not copied when a std::initializer_list is copied. Is this what happens here?

Why did it work in the first example? Was it luck? Is it something special with the case when the objects in the list contains a std::vector?

1

There are 1 best solutions below

0
On BEST ANSWER

Returning initializer_list compiles, but it seldom does the right thing. The list is a temporary value and the initializer_list object points to it. It is a dangling pointer.

In your first example, an optimization is applied because the list is a constant expression. Instead of being written into temporary storage, it is a static global. However, this optimization is not specified in the standard. The return value working, is only a form of undefined behavior.