コピー不可能なオブジェクトの値の初期化に関して、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 を含む) で失敗します。
2 つの質問:
- 標準に準拠しているのはどの動作ですか?
- gcc でこれを回避する方法の提案 (明確にするために、これを変更すること
T t;
は、POD タイプを壊すため、受け入れられる解決策ではありません)。
PS boost::noncopyable でも同じ問題が発生します。