当C ++ / 11 auto关键字更有效或总是按值传递时,它是否会推导出参数传递引用?

问题描述 投票:1回答:1

我想知道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)
c++ auto
1个回答
3
投票

应用于函数参数的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的函数。

© www.soinside.com 2019 - 2024. All rights reserved.