零值初始化&字符串常数作为函数模板参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零值初始化&字符串常数作为函数模板参数相关的知识,希望对你有一定的参考价值。

1、在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false)。

template <typename T>

void foo()

{

    T x = T();

}

 

类模板其成员有可能被参数化。为了确保初始化这样的成员,必须定义一个构造函数,在成员初始化列表中对每个成员进行初始化:

template <typename T>

class MyClass

{

       private:

         T x;

      public:

      MyClass:X(){}//这样做可以确保T为内置数据类型仍然可以被初始化

};

 

2、通过引用传递方式将字符串常数传递给函数模板参数时,有可能得到意想不到的结果:

template <typename T>

inline T const & max(T const & a, T const &b)

{

    return a<b?b:a;

}

::max("12345","45678");//OK

::max("12345","ABCDEFG");//ERROR,参数类型不同

问题在于这几个字符串常数的长度不相同,因而其底层的array类型也不同。也就是说,“12345”和“45678”的array类型为char const[5],而“ABCDEFG”的array类型为char const[7]。

 

 

如果通过值传递方式将字符串常量传递给函数模板参数是,则上面的错误会变为正确:

template <typename T>

inline T  max(T a, T b)

{

    return a<b?b:a;

}

::max("12345","45678");//OK

::max("12345","ABCDEFG");//OK

这种方式之所以成立,是因为在引数推导过程中,只有当参数并不是一个引用类型时,数组array转变为指针的动作才会发生。如下面的例子所示:

 

以上是关于零值初始化&字符串常数作为函数模板参数的主要内容,如果未能解决你的问题,请参考以下文章

作为默认模板参数的具体函数

接收 std::pair 作为参数并从花括号列表初始化推导出类型的模板化函数

C ++ lambda作为函数的模板参数不起作用

用函数指针包装 C++ 代码作为 cython 中的模板参数

ES6:模板字符串&函数&进制&Symbol数据结构

ES6:模板字符串&函数&进制&Symbol数据结构