У меня есть свойство класса шаблона, которое охватывает другие типы:
template <typename T>
class Property
{
private:
T value;
public:
Property() = default;
Property(const T& initialValue)
: value(initialValue) {}
virtual ~Property() = default;
//Make this class non-copyable.
Property(const Property&) = delete;
Property& operator=(const Property&) = delete;
virtual Property& operator=(const T& other)
{
value = other;
return *this;
}
//... a bunch of other unimportant stuff
}
Visual Studio 15.7.6 и некоторые другие компиляторы вполне довольны
{ //function or class definition (default member initialization)
Property<int> prop = 5;
}
Однако,(слегка измененный для проприетарной цели компиляции) GCC 4.9.4 завершается ошибкой в приведенном выше объявлении:
Error GD4849D22 use of deleted function
'Property<T>::Property(const Property<T>&) [with T = int]'
Похоже, что компилятор пытается создать свойство RValue, а затем использует конструктор удаленных копий вместо простого использованияконструктор, соответствующий типу.
Является ли это случаем, когда GCC слишком осторожен?
Property<int> prop(5); //explicit constructor call - valid with GCC Compiler
Property<int> myOtherProp;
myOtherProp = 5; //Also fine (obviously)
Или MSVC играет быстро и свободно и делает что-то, о чем говорит стандарт.t или нет?
К сожалению, я не могу обновить свою версию GCC.Поскольку обходной путь существует, я ищу больше «почему» это происходит, чем что-либо еще.