Я наблюдаю различное поведение между 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>();
Это прекрасно работает на msvc начиная с VC ++ 9.0, но не на всех версиях g ++, с которыми я тестировал (включая версию 4.5.0), потому что конструктор копирования является закрытым.
Два вопроса:
- Какое поведение соответствует стандартам?
- Любое предложение о том, как обойти это в gcc (и, чтобы быть понятным, изменение этого значения на
T t;
не является приемлемым решением, поскольку это нарушает типы POD).
P.S. Я вижу ту же проблему с boost :: noncopyable.