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

Lud*_*lze 3 c++ const pass-by-reference temporary-objects

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

该功能不会更改该参数.调用该函数永远不会为参数创建复制或临时对象.

例:

void f(const std::string & str);
Run Code Online (Sandbox Code Playgroud)

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

但它仍然可以称之为

const char * hello = "hello";
f(hello);
Run Code Online (Sandbox Code Playgroud)

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

是否可以通过不同的函数声明或(假设)改变std :: string实现来禁止它.

Sto*_*ica 10

我将从这里开始.

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

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

是否可以通过不同的函数声明来禁止它

事实上,另一个宣言就是门票.添加一个接受r值引用的重载,并将其定义为已删除:

void f(std::string && str) = delete;
Run Code Online (Sandbox Code Playgroud)

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