编译器是否会为ref参数实例化一个新的模板函数?

时间:2017-04-15 03:17:51

标签: c++ templates

考虑以下代码。编译器是否会生成4个函数:()每个函数都有不同的参数或只有一个?

class MyClass
{
    public:
        void foo() const {}
};

template<typename T>
void operate(T obj)
{
    obj.foo();
}

int main(int argc, char* argv[])
{
    MyClass obj;
    MyClass& refObj = obj;
    const MyClass& constRefObj = obj;
    const MyClass constObj = obj;

    operate(obj);
    operate(refObj);
    operate(constRefObj);
    operate(constObj);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

你可以试试自己。对于g++,只需运行g++ -S file.cpp并查看结果即可。对于您的代码,g++生成了单个函数实现和4个调用,如下所示:call _Z7operateI7MyClassEvT_

答案 1 :(得分:0)

第一个声明

string url = "'<a href=''/p?geoId='+Geo.GeoId+'''>'+Geo.Name+'</a>'";

是您实际创建MyClass obj; 类型对象的地方。

第二个声明

MyClass

告诉编译器&#34;当我使用名称MyClass& refObj = obj; 时,我的意思是refObj&#34;。没有创建新的类实例。

所以这两个电话都是

obj

operate(obj); operate(refObj); 的副本传递给该函数。他们只是为同一个对象使用不同的名称。所以他们肯定也称同样的功能。