函数模板与自动关键字

Function Templates vs. Auto Keyword

本文关键字:关键字 函数模板      更新时间:2023-10-16

C++11中的auto关键字能否取代函数模板和专业化?如果是,那么与简单地将函数参数键入为auto相比,使用模板函数和专业化有什么优势?

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

与。

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

简而言之,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;
}

C++11中的auto关键字能否取代函数模板和专业化?

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

如果是,那么与简单地将函数参数键入为auto相比,使用模板函数和专业化有什么优势。

如果要引用类型,则可能仍然需要命名模板参数;这将比CCD_ 7或其它更方便。

使其成为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
}