C++/11自动关键字推断到参数时要通过引用传递,这样效率更高,还是总是通过值传递? 我想知道C++是否自动足够通过参数引用。例如: void PrintString(auto string1) { std::string msg; msg = string1 + "\n"; printf("%s\n", msg.c_str()); }

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)

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 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
参数开始,则会出现问题。