使用auto作为参数会有负面影响吗?

时间:2016-04-15 15:47:10

标签: c++ templates c++14 auto

本着通用编程的精神,我创建了以下代码:

#include <iostream>
#include <functional>

class Functor
{
public:
    void operator()()
    {
        std::cout << "Functor operator called." << std::endl;
    }
};

void Function()
{
    std::cout << "Function called." << std::endl;
}

void Call( auto & fp )
{
    static int i;
    std::cout << "Unified calling..." << &i << std::endl;
    fp();
}

int main( int argc, char ** argv )
{
    Functor functor;
    std::function< void() > function = Function;

    std::cout << "Begin testing..." << std::endl;
    Call( functor );
    Call( function );
    std::cout << "End testing." << std::endl;

    return 0;
}


Compiled with: g++ main.cpp -std=c++14
output:
Begin testing...
Unified calling...0x100402080
Functor operator called.
Unified calling...0x100402090
Function called.
End testing.

从静态的地址我可以看出,它产生了两个不同的函数,所以在我看来它就像一个模板简写,一种类型。我的直觉是,要维护的一个函数优于多个函数,但是,除了注意非共享的静态变量之外,我是否遗漏了一些可能使这个选项变得不好的东西,而不是多个函数定义?

2 个答案:

答案 0 :(得分:8)

是的,有。它们被当前的C ++标准所禁止。

void Call( auto & fp )

是符合标准的编译器的编译错误。

答案 1 :(得分:-1)

这是不可能的,是主要的缺陷。

auto只是意味着在初始化时进行类型推导。它不是“任何”类型。因此,以这种方式使用auto意味着您的函数必须是一个模板。在C ++ 17中,这是可能的,实际上auto参数会自动使该函数成为模板(我个人认为这非常令人困惑,但很好)。但就目前而言,没有。