常量引用函数参数:是否可以禁止临时对象?



可以有一个强制执行以下语义的函数参数:

函数不会更改该参数。 调用该函数永远不会为参数创建副本或临时对象。

例:

void f(const std::string & str);

接口告诉客户端不会更改参数,如果参数已经是 std::string 类型,则不会创建副本。

但仍然可以将其称为

const char * hello = "hello";
f(hello);

它在进入函数 f 之前创建一个临时的 std::string 对象,并在退出 f 后再次销毁它。

是否可以禁止这样做,要么使用不同的函数声明,要么通过(假设)更改 std::string 实现。

我将从最后开始。

或通过(假设)改变std::string实现

不要这样做,因为害怕鼻魔。说真的,不要。让标准库以标准方式运行。

是否可以使用不同的函数声明来禁止此操作

事实上,另一个声明只是门票。添加一个接受 r 值引用的重载,并将其定义为已删除:

void f(std::string && str) = delete;

重载分辨率将为临时选择它,删除的定义将导致错误。您的预期函数现在只能使用 l 值调用。

最新更新