Verhalten von c ++ initializer_list und shared_ptr [duplizieren]
Diese Frage hat hier bereits eine Antwort:
Doppelte Löschung in initializer_list gegen 2013 1 AntwortIch teste vs2013 c ++ initializer_list.
Der folgende Code kann kompiliert werden. Aber stürzt ab, wenn ich exe laufen lasse.
#include <memory>
#include <iostream>
class Base {};
class Derived : public Base {};
void DoSomething(std::initializer_list<std::shared_ptr<Base> > list)
{
}
int main()
{
auto ip = std::make_shared<Derived>();
std::cout << "use_count=" << ip.use_count() << std::endl;
DoSomething({ip, std::make_shared<Derived>()}); // ng
// DoSomething({ip, std::make_shared<Base>()}); // ok
// DoSomething({std::make_shared<Derived>(), ip}); // ok
std::cout << "use_count=" << ip.use_count() << std::endl;
}
Kompiliert.
C:\...>cl.exe /EHsc test.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:test.exe
test.obj
C:\...>
Ich habe die Ausgabe so erwartet. g ++ 4.8.2 funktioniert so.
c:\...>test.exe
use_count=1
use_count=1
Sieht aber so aus.
c:\...>test.exe
use_count=1
use_count=0 // or some random value like 3719232 and displayed crash dialog.
Und wenn Sie eine Zeile des obigen Codes ändern, funktioniert dies gut.
DoSomething({std::make_shared<Derived>(), ip});
Ist dies ein Fehler oder normales Verhalten von vs2013 initializer_list?