Đoạn mã sau đưa ra cảnh báo:Cảnh báo "đối tượng tạm thời" - có phải là tôi hoặc trình biên dịch không?
[C++ Warning] foo.cpp(70): W8030 Temporary used for parameter '_Val' in call to 'std::vector<Base *,std::allocator<Base *> >::push_back(Base * const &)'
.. trên dòng được chỉ định.
class Base
{
};
class Derived: public Base
{
public:
Derived() // << warning disappears if constructor is removed!
{
};
};
std::vector<Base*> list1;
list1.push_back(new Base);
list1.push_back(new Derived); // << Warning on this line!
Compiler là Codegear C++ Builder 2007.
Nhưng kỳ lạ, nếu các nhà xây dựng cho nguồn gốc bị xóa, cảnh báo sẽ biến mất ... Có tôi hay trình biên dịch?
EDIT: Cách duy nhất tôi đã tìm thấy để loại bỏ các cảnh báo là một cái gì đó tương tự như sau:
Derived * d;
list1.push_back(d = new Derived); // << No warning now...
Không cảnh báo mã này với gcc. – kriss
Đó có thể không phải là * tất cả * mã. Do Base và Derived có các hàm tạo (các trình tạo không biên dịch)? –
@MadKeithV - cho hoặc lấy #include, đó là TẤT CẢ mã. Tôi bắt đầu với một trường hợp phức tạp hơn nhiều và cắt nó xuống xương trần cho thấy vấn đề ở trên. –
Roddy