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) 更有效吗?
还有一本书可以优雅地涵盖这个主题吗?
在语义上(忘记内联、优化和其他东西)第一个片段不需要临时的。
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