作为优化/清理过程的一部分,我试图了解如何减少临时拷贝。在执行此操作时,我注意到转换运算符调用了我类的copy-constructor,否则可以避免。

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引用版本在这种情况下就足够了。

转换运算符与GetSetViewer函数有何不同?我可以在不调用copy或move构造函数的情况下使上面的代码与转换运算符一起工作吗?

最佳答案

这是a known bug of Microsoft Visual Studio。一个错误报告已经提交了2018-11-12。没有消息从那里。

10-08 13:29