В рамках этапа оптимизации / очистки я пытаюсь понять, как уменьшить количество временных копий.При этом я заметил, что оператор преобразования вызвал конструктор копирования моего класса, которого иначе можно избежать.
struct CSetViewer
{
int s;
CSetViewer(int size) : s(size) {}
CSetViewer(const CSetViewer &) = delete;
CSetViewer &operator=(const CSetViewer &) = delete;
CSetViewer(CSetViewer &&) = delete;
CSetViewer &operator=(CSetViewer &&) = delete;
};
struct CSet
{
operator CSetViewer() { return {1}; }
CSetViewer GetSetViewer() { return {1}; }
};
void testSet(const CSetViewer &set) {}
void main()
{
CSet set;
testSet(set.GetSetViewer());
testSet(set); // Error: attempting to reference a deleted function
}
В следующем коде первый вызов testSet компилируется нормально, но второй, похоже, хочетвызвать конструктор копирования.
Добавление:
void testSet(CSetViewer &&set) {}
Создает код для компиляции (VS 2017), но я действительно не понимаю почему, поскольку я думал, что в этой ситуации будет достаточно const-reference версии.
Чем оператор преобразования отличается от функции GetSetViewer?Можно ли заставить приведенный выше код работать с оператором преобразования, не вызывая конструктор копирования или перемещения?