The following snippet gives the warning:
[C++ Warning] foo.cpp(70): W8030 Temporary used for parameter '_Val' in call to 'std::vector<Base *,std::allocator<Base *> >::push_back(Base * const &)'
.. on the indicated line.
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 is Codegear C++Builder 2007.
Oddly, if the constructor for Derived is deleted, the warning goes away…
Is it me or the compiler?
EDIT: The only way I’ve found to remove the warning is to something similar to this:
Derived * d;
list1.push_back(d = new Derived); // << No warning now...
Simple try:
I am afraid there is something about POD (with trivial constructors) vs non-POD going on here.
EDIT:
Given that the code compiles fine with gcc.3.4.2 (–pedantic) I would say it’s a compiler quirk. I am leaning toward
MarkBexplanation, ie the compiler creating a temporary even though I don’t understand why it would be required and then complaining when assigning it to theconst&… but I’m still perplex.