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?
我想知道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
函数。
相关文章:
- 通过常量引用传递参数的矩阵模板类
- 通过引用传递参数时C++类型转换
- 按值传递变量与按引用传递变量具有相同的结果
- 获取 std::函数以推断按引用传递/按值传递
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 按引用传递和按地址传递之间的差异
- C++按引用传递还是按值传递?
- 可移动但不可复制的对象:按值传递还是按引用传递?
- 使用增量运算符按引用传递
- 按引用传递函数参数
- 如果可能,C++按右值引用传递参数,否则复制左值引用
- 执行同时使用按引用传递和按值传递参数的程序时出现问题
- 混合按引用传递和按值传递到可变参数模板函数有效
- 当按引用传递参数存储在被调用方对象中,然后被调用方删除时会发生什么情况
- C++函数调用后不需要的额外按引用传递参数的模式?
- C++:如何决定是按引用还是按值传递参数
- 当我按值传递参数时,c++构建消息显示一个引用参数
- c++中引用和按引用传递参数的区别