C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?

Does C++/11 auto keyword deduce to parameters to pass-by-reference when that is more efficient, or always pass-by-value?

本文关键字:按引用传递 参数 按值传递 关键字 auto C++ 有效      更新时间:2023-10-16

我想知道C++'auto'是否足够聪明,可以通过引用[in]参数传递。 例如:

void PrintString(auto string1)
{
std::string msg;
msg = string1 + "n";
printf("%sn", msg.c_str());
}

自动是否足够智能,可以将 string1 类型推断为这样的 const 引用类型?

void PrintString(const std::string &string1)

还是它只是推断出低效的按值传递?

void PrintString(std::string string1)

应用于函数参数的auto在 C++11 中是非法的,所以你的问题没有实际意义。

C++14 允许lambda函数在参数中使用auto。但这是通过将 lambda 生成的operator()作为模板来完成的。所以[](auto val)相当于template<typename T> void some_func(T val);.就像模板的任何其他实例一样,val不是引用,除非它本身是引用类型T。模板参数推导的规则不会仅仅因为您使用了auto而不是显式模板参数而改变。

当/如果 C++20 正式允许auto处理所有功能时,情况也是如此。在非 lambda 上提供auto参数作为编译器扩展的编译器正在与 lambda 完全相同。


自动是否足够智能,可以将 string1 类型推断为这样的 const 引用类型?

那会是"聪明"的呢?用户没有要求const&参数,缺乏const和缺乏&就证明了这一点。如果用户真的想要所谓的"低效"版本(这是完全有效的事情(,那么这样的代码就不会是聪明的。事实上,在你的"智能"版本下,你将无法编写一个按值获取std::string函数。