C++/11自动关键字推断到参数时要通过引用传递,这样效率更高,还是总是通过值传递? 我想知道C++是否自动足够通过参数引用。例如: void PrintString(auto string1) { std::string msg; msg = string1 + "\n"; printf("%s\n", msg.c_str()); }
auto是否足够聪明,可以将string1类型推断为这样的const ref类型C++/11自动关键字推断到参数时要通过引用传递,这样效率更高,还是总是通过值传递? 我想知道C++是否自动足够通过参数引用。例如: void PrintString(auto string1) { std::string msg; msg = string1 + "\n"; printf("%s\n", msg.c_str()); },c++,auto,C++,Auto,auto是否足够聪明,可以将string1类型推断为这样的const ref类型 void PrintString(const std::string &string1) 或者它只是推断出无效的传递值 void PrintString(std::string string1) 在C++11中,应用于函数参数的auto是非法的,因此您的问题没有意义 C++14允许lambda函数在参数中使用auto。但这是通过将lambda生成的操作符()作为模板来实现的。所以[](auto val)
void PrintString(const std::string &string1)
或者它只是推断出无效的传递值
void PrintString(std::string string1)
在C++11中,应用于函数参数的
auto
是非法的,因此您的问题没有意义
C++14允许lambda函数在参数中使用auto
。但这是通过将lambda生成的操作符()
作为模板来实现的。所以[](auto val)
相当于模板void some_func(T val)代码>。与模板的任何其他实例一样,val
不是引用,除非T
本身是引用类型。模板参数推断规则不会因为使用了auto
而改变,而不是显式的模板参数
如果C++20正式允许auto
处理所有函数,情况也会如此。而在非lambda上提供auto
参数作为编译器扩展的编译器也在做着与lambda完全相同的事情
auto是否足够聪明,可以将string1类型推断为这样的const ref类型
void PrintString(const std::string &string1)
这会是“聪明”吗?用户没有要求使用常量&
参数,缺少常量
和&
就证明了这一点。如果用户真的想要所谓的“低效”版本(这是一个非常有效的做法),那么这样的代码就不明智了。实际上,在您的“智能”版本下,您将无法编写一个函数,它使用了<代码> STD::String 值。如果使用<代码> Auto&String 1,在C++中不允许使用这样的函数< <代码> Auto <代码>。它可能是一个编译器扩展。最好不要使用它。这是无效的C++。使用移动语义传递值并不总是低效的。在函数中使用参数的auto
的语义是针对lambda函数的,这些函数都是基于模板的。@curiousguy:这一切都取决于auto
的教学方式。如果您从模板函数开始,然后教他们一种更简单的方法来编写它们,那么就可以了。如果从auto
参数开始,则会出现问题。