为什么包含枚举的结构的隐式复制构造函数不使用const
版本 - 或者为什么根本没有复制构造函数?我希望创建一个隐式的复制构造函数,即:
X(const X& x)
我知道有可能发生这种情况的规则,例如,如果成员变量没有复制构造函数或非const复制构造函数。我想我的问题是这与枚举有什么关系 - 如果适用这条规则?
添加我自己的拷贝构造函数似乎有效。
示例 - 隐式创建复制构造函数(如果有):
struct MyStruct {
int myInt;
double myDouble;
MyEnum myEnum;
};
答案 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& )
将更接近匹配,并被选中。