【问题标题】:How do I avoid a conversion operator to invoke the copy constructor?如何避免转换运算符调用复制构造函数?
【发布时间】:2019-01-28 17:43:13
【问题描述】:

作为优化/清理过程的一部分,我试图了解如何减少临时副本。在执行此操作时,我注意到转换运算符调用了我的类的复制构造函数,否则可以避免。

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 函数有何不同?我可以在不调用复制或移动构造函数的情况下使上面的代码与转换运算符一起使用吗?

【问题讨论】:

标签: c++ conversion-operator


【解决方案1】:

这是a known bug of Microsoft Visual Studio。已于 2018 年 11 月 12 日提交了一份错误报告。那里没有消息。

【讨论】:

  • 哇。那是一些快速的工作。这是我会去看的最后一个地方。 :)
  • 自从引入开发者社区后,错误从用户流向开发团队的速度更快。
猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 2017-09-03
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多