Как мне избежать оператора преобразования для вызова конструктора копирования?

В рамках этапа оптимизации / очистки я пытаюсь понять, как уменьшить количество временных копий. При этом я заметил, что оператор преобразования вызвал конструктор копирования моего класса, которого иначе можно избежать.

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? Можно ли заставить приведенный выше код работать с оператором преобразования, не вызывая конструктор копирования или перемещения?

1 ответ

Решение

Это известная ошибка Microsoft Visual Studio. Отчет об ошибке был подан 2018-11-12. Новостей оттуда нет.

Другие вопросы по тегам