具有枚举的struct的C ++拷贝构造函数的签名

时间:2012-02-02 07:43:13

标签: c++ enums struct copy-constructor

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

X(const X& x)

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

添加我自己的拷贝构造函数似乎有效。

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

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

2 个答案:

答案 0 :(得分:1)

你对枚举的猜测是错误的;问题出在其他地方。如果没有显式定义复制构造函数,则下面的代码编译没有问题,如果有一个复制构造函数采用非const引用,则无法编译。

#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;
}

正如其他人在评论中指出的那样,需要一个证明错误的现实例子才能理解真正的问题。

答案 1 :(得分:0)

这有点偏离我的专业知识。

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