Как мне избежать оператора преобразования для вызова конструктора копирования? - PullRequest
0 голосов
/ 28 января 2019

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

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 Ответ

0 голосов
/ 28 января 2019

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

...