是否有编译器开关默认关闭复制构造?
不,我真的希望没有。幸运的是,据我所知,情况确实如此。
我是否有理由允许对内置类型和指针以外的任何内容进行复制构造?
当然。例如,为您的类型提供值语义并将您的类的不同实例视为相同的概念实体。在这种情况下,创建副本是一件非常方便的事情。
另一方面,如果您想要一个不可复制的类(有此用例),您可以将复制构造函数声明为private
(如您自己建议的那样),或者在 C++11 中,将其标记为已删除:
struct X
{
X(X const&) = delete;
};
关于你写的:
太多次,我已经写void MyFunc(MyClass val)
而不是void MyFunc(const MyClass& val)
并且不得不花费数小时调试错误
我知道你可能会犯错误,但你必须从中吸取教训。您还可以编写一个普通函数,foo()
如下所示:
void foo(int x) { x++; }
并且发誓要弄清楚为什么,当你将它作为参数传递一个3
值为 的变量时,调用返回后该变量的值不是4
。哦,你忘了添加参考符号:
void foo(int& x) { x++; }
// ^
现在这是需要一个编译器选项的原因吗?它可以使传递引用成为默认值?并不真地。这将是改变语言规则的一种选择。
想象一下,如果你的编译器真的有这样一个你想要的开关,有一天你会把你的程序发送给没有使用那个开关的其他人:他们会花多少小时调试它来找出问题所在?
我的建议是从经验中学习并尝试使您的阅读和写作技能适应标准语言,而不是相反。