I've tried the C++0x initializer-list implementation of my G++ version but it outputs only empty lines.
#include <initializer_list>
#include <iostream>
#include <string>
int main() {
std::initializer_list<std::string> a({"hello", "stackoverflow"});
for(auto it = a.begin(), ite = a.end(); it != ite; ++it)
std::cout << *it << std::endl;
}
I have no idea what I did wrong. Can anyone help me out please?
It looks like you're creating two initializer lists in the example above. Temporary {"hello", "stackoverflow"}
and std::initializer_list<std::string> a
.
On gcc, {}
initializer lists are in fact temporary arrays whose lifetime ends after full statement (unless bound directly to std::initializer_list
like in the commented line in the example below).
The lifetime of internal array of the first list ends right after a
's constructor returns and thus a
's array now points to invalid memory (gcc only copies the pointer). You can check, that std::string
destructors get called before you enter the loop.
And when you get to loop, you're reading invalid memory.
According to lastest standard draft (n3242), §18.9/1, initializer lists cannot be even copied like that (they provide no constructor with parameters).
#include <initializer_list>
#include <iostream>
class A
{
public:
A(int)
{ }
~A()
{
std::cout << "dtor" << std::endl;
}
};
int main()
{
std::initializer_list<A> a({A(2), A(3)});
// vs std::initializer_list<A> a{A(2), A(3)};
std::cout << "after a's construction" << std::endl;
}
With gcc 4.5.0, I get
dtor
dtor
after a's construction
std::initializer_list<std::string> a({"hello", "stackoverflow"});
If I declare that as:
std::initializer_list<std::string> a{"hello", "stackoverflow"}; //without ()
then it's working : http://ideone.com/21mvL
But that is weird. Looks like its a compiler bug.
EDIT:
Its most certainly a compiler bug, because if I write (*it).c_str()
it prints the strings!!
std::initializer_list<std::string> a({"hello", "stackoverflow"}); //with ()
for(auto it = a.begin(), ite = a.end(); it != ite; ++it)
std::cout << (*it).c_str() << std::endl;
Code : http://ideone.com/hXr7V
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With