我想知道C ++'auto'是否足够聪明,可以通过[in]参数传递。例如:
void PrintString(auto string1)
{
std::string msg;
msg = string1 + "\n";
printf("%s\n", msg.c_str());
}
auto auto足以将string1类型推导为像这样的const ref类型吗?
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
处理所有函数时,情况也是如此。并且在非lambdas上提供auto
参数作为编译器扩展的编译器正在完成它们对lambdas的操作。
auto auto足以将string1类型推导为像这样的const ref类型吗?
这会是什么“聪明”?用户没有要求const&
参数,正如缺乏const
和缺乏&
所证明的那样。如果用户真正想要所谓的“低效”版本(这是完全有效的事情),那么这样的代码就不会很聪明。实际上,在你的“智能”版本下,你将无法编写一个按值获取std::string
的函数。