При тестировании некоторых классов я сталкиваюсь с интересной проблемой: при вызове конструктора класса с использованием нотации равенства (=), если конструктор копирования удален, возникает ошибка ошибка: копирование переменной типа 'Class' вызывает удалениеконструктор .При использовании круглых скобок код компилируется нормально.
Что здесь происходит?Может ли это быть ошибкой компилятора?
Рассмотрим следующий класс:
class Test
{
public:
int Int;
public:
Test() = default;
Test(Test &) = delete;
Test(Test &&) = delete;
Test(int i)
{
Int = i;
}
};
Конструкторы вызываются так:
Test t1(3); //No error
Test t2 = 3; //error: copying variable of type 'Class' invokes deleted constructor
Просто для проверки я пыталсядобавьте некоторые проверки и разрешите эти функции и скомпилируйте код.Оба конструктора скомпилировали , используя MSVC точно таким же образом .
class Test
{
public:
int Int;
public:
Test()
{
Int = 0;
cout << "Constructor";
}
Test(Test &t)
{
Int = t.Int;
cout << "Copy Constructor";
}
Test(Test &&t)
{
Int = t.Int;
cout << "Move Constructor";
}
Test(int i)
{
Int = i;
cout << "Constructor from int";
}
};
Test t1(3); //Constructor from int
Test t2 = 3; //Constructor from int
Что именно здесь происходит?