Как показано в следующем коде, содержащие std :: initializer_list объекты уничтожаются даже до завершения области действия. Я хотел бы знать, не соответствует ли код стандарту или это ошибка в clang (так как он прекрасно работает с gcc и vc).
#include <iostream>
class Attrib
{
public:
Attrib()
{
std::cout<< "Constructor called"<< std::endl;
}
Attrib(const Attrib& r)
{
std::cout<< "Copy constructor called"<< std::endl;
}
~Attrib()
{
std::cout<< "Destructor called"<< std::endl;
}
};
int main()
{
auto attribs = std::initializer_list<Attrib>({Attrib()});
std::cout<< "Before returning from main"<< std::endl;
return 0;
}
Выход в лязг ,
Constructor called
Destructor called
Before returning from main
Вывод в gcc,
Constructor called
Before returning from main
Destructor called
EDIT:
Если мы немного изменим строку создания initializer_list в main следующим образом,
std::initializer_list<Attrib> attribs = {Attrib()};
Выход в CLang равен,
Constructor called
Before returning from main
Destructor called