【发布时间】:2018-10-17 02:50:44
【问题描述】:
可以有一个强制执行以下语义的函数参数:
参数不会被函数改变。 调用函数永远不会为参数创建副本或临时对象。
例子:
void f(const std::string & str);
接口告诉客户端参数不会被改变,如果参数已经是std::string类型,则不会创建副本。
不过还是可以这样称呼
const char * hello = "hello";
f(hello);
在进入函数 f 之前创建一个临时 std::string 对象,并在退出 f 后再次销毁它。
是否可以通过不同的函数声明或(假设)更改 std::string 实现来禁止这种情况。
【问题讨论】:
-
对我来说听起来像是 XY 问题。该语言的优点之一是自动临时创建和绑定。你为什么要禁止这个?如果您关心由于调用构造函数而可能导致的性能下降,那应该不是 API 提供者的问题,而是调用者的问题。
std::string的实际解决方案是使用std::string_view或自制解决方案。 -
必须查一下 xy-problem 是什么意思。不,我不这么认为。同意这将是客户的责任。但这也是我,我很好奇我是否可以确保我不会在我的电话中犯错误。 std::string 在这里仅用作示例。对 std::string 不是特别感兴趣。一件好事是我学到了一些关于 =delete 的新知识。
标签: c++ constants pass-by-reference temporary-objects