我看到 g++ 和 msvc 之间围绕值初始化不可复制对象的一些不同行为。考虑一个不可复制的类:
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_;
};
和一个使用值初始化的模板,这样即使类型是 POD,值也会得到一个已知值:
template <class T>
void doit()
{
T t = T();
...
}
并尝试将它们一起使用:
doit<noncopyable>();
从 VC++ 9.0 开始,这在 msvc 上运行良好,但在我测试过的每个 g++ 版本(包括 4.5.0 版)上都失败了,因为复制构造函数是私有的。
两个问题:
- 哪种行为符合标准?
- 关于如何在 gcc 中解决此问题的任何建议(并且要明确的是,将其更改
T t;
为不可接受的解决方案,因为这会破坏 POD 类型)。
PS 我在 boost::noncopyable 上看到了同样的问题。