2017-12-31 188 views
7

Tôi có một lớp A mất initializer_list và lưu nó dưới dạng biến thành viên.sử dụng std :: initializer_list làm biến thành viên

class A 
{ 
public: 
    A(std::initializer_list<std::string> il) : 
     m_il(il) 
    {} 

    std::initializer_list<std::string> m_il; 
}; 

Một lớp BA như là một biến thành viên đó là mặc định khởi tạo bằng cách sử dụng initializer_list

class B 
{ 
public: 
    B() 
    { 
     std::cout << *m_a.m_il.begin() << std::endl; 
    } 

    A m_a { "hello", "bye" }; 
}; 

Bây giờ khi tôi chạy mã này trong chính, nó in gì cả.

int main() 
{ 
    B b; 
} 

Tại sao mã ở trên không in hello? Việc sử dụng std::initializer_list của tôi có đúng không?

+2

Không sử dụng 'initializer_list' làm thành viên dữ liệu. – 0x499602D2

+0

Việc khởi tạo một thành viên lớp không tĩnh thậm chí còn được đề cập [ở đây] (http://en.cppreference.com/w/cpp/utility/initializer_list) như một cái gì đó đặc biệt _không thể kéo dài tuổi thọ của tạm thời cơ bản – Useless

Trả lời

6

Sao chép std::initializer_list không sao chép các đối tượng bên dưới của nó. Nó không có nghĩa là để được sử dụng như một container. Thay vào đó, những gì bạn nên làm là lưu trữ nó trong một số thứ khác, chẳng hạn như số std::vector:

class A 
{ 
public: 
    A(std::initializer_list<std::string> il) : 
     m_il(il) 
    {} 

    std::vector<std::string> m_il; 
}; 
Các vấn đề liên quan