【问题标题】:Signature of C++ copy constructor for struct with an enum带有枚举的结构的 C++ 复制构造函数的签名
【发布时间】:2012-02-02 07:43:12
【问题描述】:

为什么包含枚举的结构的隐式复制构造函数使用const 版本 - 或者为什么根本没有复制构造函数?我希望创建一个隐式复制构造函数,即:

X(const X& x)

我知道在何时发生这种情况时有一些规则,例如,如果成员变量没有复制构造函数或非常量复制构造函数。我想我的问题是这与枚举有什么关系——如果是这条规则适用?

添加我自己的复制构造函数似乎可行。

示例 - 隐式创建的复制构造函数(如果有):

struct MyStruct {
  int myInt;
  double myDouble; 
  MyEnum myEnum;
};

【问题讨论】:

  • C++ 什么时候不能合成复制构造函数?如果其中一个成员无法复制,则根本不会生成自动复制构造函数,故事结束。
  • 如果它是隐式的,你能解释一下你是如何知道复制构造函数有这个签名的吗? int main() { const X x1; X x2(x1); } 不行吗?
  • 请举一个具体的例子来说明问题。
  • 请发布一个简单但完整的示例来演示您的问题,如sscce.org 所述。
  • @Magnus 我们永远不会通过猜测来找出问题所在。请发布一个完整的示例,其中包括 MyEnum 的定义、MyStruct 的定义以及您尝试在标准容器中使用 MyStruct 的方式,我们可以尝试自己编译并自己查看错误。然后我们可以告诉你发生了什么。

标签: c++ enums struct copy-constructor


【解决方案1】:

您对枚举的猜测是错误的;问题出在其他地方。如果没有显式定义复制构造函数,则以下代码编译没有问题,如果存在采用非常量引用的复制构造函数,则编译失败。

#include <iostream>
#include <iterator>
#include <vector>

enum MyEnum {
  e0, e1, e2
};

struct MyStruct {
  int myInt;
  double myDouble; 
  MyEnum myEnum;
  // MyStruct(MyStruct& ){} // uncomment to make compilation fail
};

std::ostream& operator<<(std::ostream& out, const MyStruct& s) {
  out<<"{"<<s.myInt<<","<<s.myDouble<<","<<s.myEnum<<"}";
  return out;
}

int main() {
  MyStruct s = {42, 3.1415926, e0};
  MyStruct s1 = s;
  std::vector<MyStruct> v(10, s1);
  std::copy(v.begin(), v.end(), std::ostream_iterator<MyStruct>(std::cout,"\n"));
  return 0;
}

正如其他人在 cmets 中指出的那样,需要一个实际的示例来证明错误,以了解真正的问题是什么。

【讨论】:

  • 你是对的。问题出在代码的其他地方。我的问题是我无法访问所有这些。有趣(?)的事情是,当我实现自己的复制构造函数并调用push_back 时,它永远不会返回。我猜某处有内存和/或线程问题。如果我当然没有搞砸构造函数:-)
【解决方案2】:

这有点超出我的专业知识。

当您尝试从X 的非常量左值实例构造X 时,签名X(X&amp; ) 将更接近并被选中。

【讨论】:

  • 但只有在两种形式都被声明的情况下,这只有在它们都是用户声明的情况下才会发生。
猜你喜欢
  • 1970-01-01
  • 2016-07-17
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多