"临时对象"警告 - 是我还是编译器?

Rod*_*ddy 7 c++ warnings c++builder

以下代码段给出了警告:

[C++ Warning] foo.cpp(70): W8030 Temporary used for parameter '_Val' in call to 'std::vector<Base *,std::allocator<Base *> >::push_back(Base * const &)'
Run Code Online (Sandbox Code Playgroud)

..在指定的行上.

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!
Run Code Online (Sandbox Code Playgroud)

编译器是Codegear C++ Builder 2007.

奇怪的是,如果Derived的构造函数被删除,警告就会消失......是我还是编译器?

编辑:我发现删除警告的唯一方法是类似于此:

Derived * d;
list1.push_back(d = new Derived);  // << No warning now...
Run Code Online (Sandbox Code Playgroud)

Mat*_* M. 2

简单的尝试:

list1.push_back(new Derived());
Run Code Online (Sandbox Code Playgroud)

我担心 POD(带有简单的构造函数)与非 POD 之间存在一些问题。

编辑

鉴于代码可以使用 gcc.3.4.2 (--pedantic)很好地编译,我会说这是编译器的怪癖。我倾向于MarkB解释,即编译器创建一个临时的,即使我不明白为什么需要它,然后在将其分配给...时抱怨const&......但我仍然感到困惑。