必须禁用哪个运算符以防止按值传递

Which operator must be disabled to prevent passing by value

提问人:Makogan 提问时间:7/13/2022 更新时间:7/13/2022 访问量:105

问:

在所有的moove,copy,copy分配...运营商

必须删除哪些内容才能避免按值传递对象?例如。

class MyClass { int val; };

可以声明以下内容:

void Fun(MyClass param) {}

我希望编译器在这种情况下抱怨,但在通过引用时感到高兴

即这 2 个很好:

void Fun(MyClass& param) {}
void Fun(const MyClass& param) {}
C++ 运算符重载 参数传递 引用

评论

2赞 NathanOliver 7/13/2022
传递 by value 接受左值和右值,因此不允许这些意味着您需要使类不可复制且不可移动。
0赞 Sam Varshavchik 7/13/2022
C++ 不以这种方式工作。你无法“阻止”它。即使删除了复制构造函数,类实例也始终可以构造为临时实例,只要有办法以任何方式构造实例即可。
1赞 user17732522 7/13/2022
为什么要让编译器抱怨?即使禁用了所有复制和移动操作,如果存在例如可用的构造函数,它仍然可以称为 或 。void Fun(MyClass param) {}MyClassFun(MyClass(/*args*/))Fun({/*args*/})
1赞 Peter 7/13/2022
有几种方法可以禁用类的传递值,但它们不涉及更改运算符。简单的方法包括制作复制构造函数和移动构造函数(尝试按值传递对象的代码无法访问)或 - 从C++11开始 - 这些构造函数。标记析构函数可以实现类似的效果(因为如果无法访问临时对象,则无法构造临时对象)。这不会阻止声明按值接受参数的函数,但会限制调用它的能力。privatedeleteprivate
0赞 JaMiT 7/13/2022
“我希望编译器在这种情况下投诉”——为什么?这有什么危害?(一旦你知道为什么这是有害的,可能有一种更有针对性的方法来防止这种伤害。

答: 暂无答案