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

3

为了实现通用编程,我创建了以下代码:

#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.

据我所知,根据静态地址的信息来看,这将产生两个不同的函数,因此它似乎是一种模板缩写。我的直觉是,维护一个函数比维护多个函数更好,但除了注意非共享静态变量外,我是否错过了某些东西,使得这是一个不良的选择,而不是多个函数定义?

你只能在通用lambda中使用auto... 对于函数,请使用模板。 - WhiZTiM
2
这是一个非标准扩展,是模板的简写形式,显然可能会被添加到C++17标准中。不是c++14的一部分。 - HostileFork says dont trust SE
2
@HostileFork 不会包含在 C++17 中。 - Barry
1
@Barry 可能是最好的选择...但也许你可以告诉那个回答的作者更新一下,从“可能发生”改为“不会发生”,并附上适当的参考资料。 - HostileFork says dont trust SE
@HostileFork 在那个答案上也留了一条评论。 - Barry
2个回答

8

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

void Call( auto & fp )

这是标准兼容编译器的编译错误。

-1

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

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


这是适用于通用 lambda 的任何类型。 - SergeyA
2
@SergeyA 如果Call是一个通用的 lambda,那将会很相关? - Barry
@SergeyA:不是这样的——它会被推断出的任何类型所替换。我试图表达的观点(诚然表达得不太好)是,auto并不像一些新手认为的那样是一个独立的类型。一个对象不能“是”auto。我强烈怀疑这种误解是这个问题的核心所在。 - Lightness Races in Orbit
可能。我现在更明白你的意思了,就像auto不是boost::any一样。但是它仍然不是在使用通用lambda初始化时进行推导,因此该语句并不涵盖所有情况。我认为,如果重新措辞以更清晰地表达,答案会更好。 - SergeyA
@SergeyA:真正重要的是,原帖中的代码是有问题的。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接