30

C++11 中的关键字可以auto替换函数模板和特化吗?如果是,那么使用模板函数和特化与简单地将函数参数键入为相比有什么优势auto

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

对比

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

3 回答 3

13

简而言之,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;
}
于 2013-08-08T20:36:40.100 回答
6

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

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

如果是,那么使用模板函数和特化与简单地将函数参数键入为auto.

如果你想引用类型,你可能仍然需要一个命名模板参数;那会比std::remove_reference<decltype(arg)>::type什么都方便。

于 2013-08-08T20:47:45.260 回答
4

唯一使它成为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
}
于 2019-05-15T21:52:08.263 回答