功能模板与自动关键字

时间:2013-08-08 20:34:27

标签: c++ templates auto

C ++ 11中的auto关键字可以替换函数模板和特化吗?如果是,使用模板函数和特化而不是简单地将函数参数键入auto有什么好处?

template <typename T>
void myFunction(T &arg)
{
    // ~
}

VS

void myFunction(auto &arg)
{
    // ~
}

3 个答案:

答案 0 :(得分:9)

简而言之,auto不能用于省略函数参数的实际类型,因此坚持使用函数模板和/或重载。 auto在法律上用于自动推断变量的类型:

auto i=5;

要非常小心地理解以下几点之间的区别:

auto x=...
auto &x=...
const auto &x=...
auto *px=...; // vs auto px=... (They are equivalent assuming what is being 
              //                 assigned can be deduced to an actual pointer.)
// etc...

它也用于后缀返回类型:

template <typename T, typename U>
auto sum(const T &t, const U &u) -> decltype(t+u)
{
  return t+u;
}

答案 1 :(得分:6)

  

C ++ 11中的auto关键字可以替换函数模板和特化吗?

没有。有提议将关键字用于此目的,但它不在C ++ 11中,我认为C ++ 14只允许它用于多态lambda,而不是函数模板。

  

如果是,使用模板函数和特化而不是简单地将函数参数键入auto有什么好处。

如果要引用类型,您可能仍需要命名模板参数;这比std::remove_reference<decltype(arg)>::type或其他更方便。

答案 2 :(得分:0)

使auto关键字不同于template的唯一原因是您无法使用auto关键字来创建通用类。

class B { auto a; auto b; }

创建上述类的对象时,会给您一个错误。

B b; // Give you an error because compiler cannot decide type so it can not be assigned default value to properties

使用模板,您可以创建一个通用类,如下所示:

template <class T> 

class B {
    T a;
};

void main() {
    B<int> b; //No Error
}