作为优化/清理过程的一部分,我试图了解如何减少临时拷贝。在执行此操作时,我注意到转换运算符调用了我类的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。没有消息从那里。