是否通过使用数字文字调用函数来创建临时对象?

ken*_*kar 1 c++ initialization

假设我有一些简单的东西:

void f(int a){...}
int main()
{
   f(3);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我们调用 f(3) 时,初始化是如何在稍低的抽象级别上发生的?临时对象是使用值 3 创建的还是仅通过复制初始化进行初始化?

主要是因为我在这段代码中遇到了这个问题:

void f(int a){...}
void f(int&& a){...}
int main()
{
   f(3);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

...我收到一个错误,说它不明确。因为我很确定调用函数 f(int&& a) 我们得到了一个临时对象的创建,该对象获得了一个引用 a 的生命周期扩展,我还要说调用 f(int a) 也会调用 a暂时的。否则,编译器不应该选择调用 f(int a) 更有效吗?

还有一本书可以优雅地涵盖这个主题吗?

Ser*_*eyA 5

在语义上(忘记内联、优化和其他东西)第一个片段不需要临时的。

void f(int a){...}
Run Code Online (Sandbox Code Playgroud)

当您像 in 一样调用此函数时f(3),将使用(伪)复制构造函数 of 创建一个整数对象int,用作函数参数。这成为函数的局部参数,当函数返回时它的生命周期结束。

同时,第二个片段

void f(int&& a){...}
Run Code Online (Sandbox Code Playgroud)

需要调用代码来创建临时 int 变量(因为您不能将任何类型的引用绑定到数字文字)。之后,右值引用绑定到临时创建。

对于您的“效率”问题,编译器不会根据效率选择函数重载。他们根据特定的转换排名来执行此操作,在您的情况下,副本和参考绑定具有相同的排名。您可以在此处阅读有关重载解析的更多信息:https : //en.cppreference.com/w/cpp/language/overload_resolution