c ++ initializer_list и shared_ptr поведение [дубликаты]

На этот вопрос уже есть ответ здесь:

Двойное удаление в initializer_list против 2013 1 ответ

Я тестирую vs2013 c ++ initializer_list.

Код ниже можно скомпилировать. Но вылетает, когда я запускаю exe.

#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;
}

Составляет.

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:\...>

Я ожидал выход, как это. g ++ 4.8.2 работает так.

c:\...>test.exe
use_count=1
use_count=1

Тем не менее, выглядит так.

c:\...>test.exe
use_count=1
use_count=0 // or some random value like 3719232 and displayed crash dialog. 

И, изменив одну строку кода выше, это работает хорошо.

DoSomething({std::make_shared<Derived>(), ip});

Это ошибка или нормальное поведение vs2013 initializer_list?

Ответы на вопрос(1)

Ваш ответ на вопрос