I m 看到在“g++”和“msvc”之间对非可扩展物体的初始价值存在某些不同的行为。 a. 属于不可扩展的类别:
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_;
};
以及使用价值初始化的模板,以便即使类型为分配,价值也会得到已知的价值:
template <class T>
void doit()
{
T t = T();
...
}
并试图共同使用:
doit<noncopyable>();
截至VC++为止,这部工厂在武器上课。 9.0,但每版本g++都失败 我用(包括4.5.0版)测试了这一情况,因为复印件的构件是私人的。
两个问题:
- 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 promotion:noncopyable.