I'm seeing some different behavior between g++ and msvc around value initializing non-copyable objects. Consider a class that is non-copyable:
class noncopyable_base { public: noncopyable_base() {} private: noncopyable_base(const noncopyable_base &); noncopyable_base &operator=(const noncopyable_base &); }; class noncopyable : private noncopyable_base { public: noncopyable() : x_(0) {} noncopyable(int x) : x_(x) {} private: int x_; }; and a template that uses value initialization so that the value will get a known value even when the type is POD:
template <class T> void doit() { T t = T(); ... } and trying to use those together:
doit<noncopyable>(); This works fine on msvc as of VC++ 9.0 but fails on every version of g++ I tested this with (including version 4.5.0) because the copy constructor is private.
Two questions:
- Which behavior is standards compliant?
- Any suggestion of how to work around this in gcc (and to be clear, changing that to
T t;is not an acceptable solution as this breaks POD types).
P.S. I see the same problem with boost::noncopyable.