可以使用一个强制执行以下语义的函数参数:
该功能不会更改参数。 调用该函数永远不会为参数创建复制或临时对象。
示例:
void f(const std::string & str);
Interface告诉客户端参数不会被更改,如果参数已经是std :: string类型,则不会创建副本。
但仍然可以将其称为
const char * hello = "hello";
f(hello);
在输入函数f之前创建一个临时的std :: string对象,并在退出f后再次销毁它。
是否可以通过不同的函数声明或(假设)更改std :: string实现来禁止它。
答案 0 :(得分:10)
我将从这里开始。
或通过(假设)改变
std::string
实施
不要这样做,因为害怕鼻子恶魔。说真的,不要。让标准库以标准方式运行。
是否可以通过不同的函数声明
禁止此操作
事实上,另一个宣言就是票。添加一个接受r值引用的重载,并将其定义为已删除:
void f(std::string && str) = delete;
重载分辨率将为临时选择它,删除的定义将导致错误。现在只能使用l值调用您的预期函数。