为什么您必须声明/创建一个单独的变量来通过引用调用,而不仅仅是在函数调用中创建一个自动对象

Why do you have declare/create a separate variable to call by reference rather than just creating an automatic object in the function call?

本文关键字:一个 创建 不仅仅是 调用 对象 引用 函数调用 变量 声明 单独 为什么      更新时间:2023-10-16

给定:

void foo(std::string &s) { 
 ...
}

为什么这会导致编译器错误:

foo(std::string("fail"));

因为这很好:

std::string s("winning");
foo(s);

故障情况的错误为error: no matching function for call to ‘foo(std::string)’

在获胜的情况下,我认为编译器无论如何都会优化s。我在这里缺少什么概念?

Pass-by-非const引用用于输出(和inout)参数。

当您传递一个临时的时,没有地方可以放置输出并由调用方检索。所以语言规则不允许这样。(除了一个例外——即使在非const成员函数中,this也可以绑定到临时的)

如果仅输入参数,则通过const引用。如果参数将所有权转移到函数,则通过右值引用传递。这两家公司都接受临时合同。

如前所述,您的函数要求一个可修改的字符串,而您给出的是const(所有temp都是const)。将您的函数签名修改为:

void foo(const std::string &s) { 
 ...
}

使用const引用参数,一切都将如您所期望的那样工作。

相关文章: