Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在什么情况下应该使用自动类型?_C++_Lambda_Auto_C++14_Std Function - Fatal编程技术网

C++ 在什么情况下应该使用自动类型?

C++ 在什么情况下应该使用自动类型?,c++,lambda,auto,c++14,std-function,C++,Lambda,Auto,C++14,Std Function,关于何时使用auto 明确地说,这是不是更清楚,尽管上下文 最好是显式的,而不是自动的 对于lambda函数,使用auto如何 auto f = [](auto v, auto x) {}; //or std::function<void(auto v, auto x)> f; autof=[](autov,autox){}; //或 std::函数f; 感谢……就我个人而言,我倾向于使用auto来选择几种类型的代码: 无法表达的类型,如lambdas创建的类型: auto f

关于何时使用
auto

  • 明确地说,这是不是更清楚,尽管上下文
  • 最好是显式的,而不是自动的
  • 对于lambda函数,使用
    auto
    如何

    auto f = [](auto v, auto x) {};
    //or
    std::function<void(auto v, auto x)> f;
    
    autof=[](autov,autox){};
    //或
    std::函数f;
    

    感谢……

    就我个人而言,我倾向于使用
    auto
    来选择几种类型的代码:

  • 无法表达的类型,如lambdas创建的类型:

    auto f = []() { /* some code */ };
    
  • 迭代器,因为它们都实现相同的不透明接口。我不在乎它是什么类型的迭代器,只是它的行为就像一个迭代器

    auto it = m.find(key);
    if(it != m.end() {
        /* some code */
    }
    
  • 如果类型已在同一行上显示,例如:

    float f = 123.456;
    /* some code */
    auto n = static_cast<int>(f);
    
    float f=123.456;
    /*一些代码*/
    自动n=静态(f);
    
    或类似地:

    if(auto p = dynamic_cast<Derived *>(base_ptr)) {
        /* some code here */
    }
    
    if(自动p=动态施法(基本施法)){
    /*这里有一些代码*/
    }
    
  • 至于其他方面,我将倾向于直言不讳

    关于
    std::function
    vs
    auto
    ,我会在可能的时候使用
    auto
    ,然后根据需要使用
    std::function
    。这是因为
    std::function
    有一点开销,因为它是使用类型擦除技术实现的

    这通常意味着我将使用模板来实现在合理的情况下接受“可调用的东西”的函数


    也就是说,如果我需要存储一个函数,可能需要传递它,那么
    std::function
    非常适合。

    您提供的两行代码做两件截然不同的事情。lambda是一种情况,实际上必须使用auto,因为它们的类型只有编译器知道。我可能会对你感兴趣。@MikeMB我不知道。这两行都不编译,所以它们做的是相同的事情。一行更接近编译?(仅缺少2个字符)。另一个包含了对C++14的
    auto
    的基本误解。@Yakk:你是对的,尤其是函数版本没有任何意义。但是lambdas和std::function在表示什么以及如何存储方面有着根本的不同。每个lambda都是一个具有自己类型的函数对象,并在堆上创建
    std::function
    是包装器,可以包装不同的函数或函数对象,只要它们具有正确的接口。很可能我也误解了这个问题,因为我关注的是何时对变量使用auto,而不是lambdas的参数类型推断。@mike lambdas不使用免费存储/堆存储。。。不是没有帮助。@yack:对不起,太晚了,我当然是说“堆叠”