如何避免转换运算符调用复制构造函数?

时间:2019-01-28 17:43:13

标签: c++ conversion-operator

作为优化/清理过程的一部分,我试图了解如何减少临时副本。在执行此操作时,我注意到转换运算符调用了我类的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函数有何不同?我可以在不调用复制或移动构造函数的情况下使上面的代码与转换运算符一起工作吗?

1 个答案:

答案 0 :(得分:3)

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