#include <initializer_list>
#include <iostream>
#include <vector>
struct something
{
std::vector < int > _Value;
something( const std::initializer_list < int >& _List ) : _Value( { _List } ) {}
std::vector < int >& get_vector() { return ( _Value ); }
~something() { std::cout << "destructor" << std::endl; }
};
int main()
{
// 危険なコード
for( auto e : something { 1,2,3,4,5,6,7,8,9,0 }.get_vector() ) // get_vectorは内部に持つvectorへの参照を返す
{ // 破棄されたオブジェクトへの参照
std::cout << e;
}
std::cout << std::endl;
// 安全なコード
for( auto e : std::vector < int > { 1,2,3,4,5,6,7,8,9,0 } )
{ // 一時オブジェクトはキャプチャされ延命されている
std::cout << e;
}
}
I2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnN0cnVjdCBzb21ldGhpbmcKewogIHN0ZDo6dmVjdG9yIDwgaW50ID4gX1ZhbHVlOwogIAogIHNvbWV0aGluZyggY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0IDwgaW50ID4mIF9MaXN0ICkgOiBfVmFsdWUoIHsgX0xpc3QgfSApIHt9CiAgc3RkOjp2ZWN0b3IgPCBpbnQgPiYgZ2V0X3ZlY3RvcigpIHsgcmV0dXJuICggX1ZhbHVlICk7IH0KICB+c29tZXRoaW5nKCkgeyBzdGQ6OmNvdXQgPDwgImRlc3RydWN0b3IiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKaW50IG1haW4oKQp7CiAgLy8g5Y2x6Zm644Gq44Kz44O844OJCiAgZm9yKCBhdXRvIGUgOiBzb21ldGhpbmcgeyAxLDIsMyw0LDUsNiw3LDgsOSwwIH0uZ2V0X3ZlY3RvcigpICkgLy8gZ2V0X3ZlY3RvcuOBr+WGhemDqOOBq+aMgeOBpHZlY3RvcuOBuOOBruWPgueFp+OCkui/lOOBmQogIHsgLy8g56C05qOE44GV44KM44Gf44Kq44OW44K444Kn44Kv44OI44G444Gu5Y+C54WnCiAgICBzdGQ6OmNvdXQgPDwgZTsKICB9CiAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCQogIC8vIOWuieWFqOOBquOCs+ODvOODiQogIGZvciggYXV0byBlIDogc3RkOjp2ZWN0b3IgPCBpbnQgPiB7IDEsMiwzLDQsNSw2LDcsOCw5LDAgfSApCiAgeyAvLyDkuIDmmYLjgqrjg5bjgrjjgqfjgq/jg4jjga/jgq3jg6Pjg5fjg4Hjg6PjgZXjgozlu7blkb3jgZXjgozjgabjgYTjgosKICAJc3RkOjpjb3V0IDw8IGU7CiAgfQp9Cg==