-
完美转发 完美转发真正使用时,通常具有“完美转发参数到另一函数调用参数”的形式,或者类似形式。
template<typename Arg> ... func(Args&& arg){ ... func2(std::forward<Arg>(arg)); ... }相比直接传递更安全些,但是功能基本与
std::static_cast<T&&>()在模板中使用时一致。-
当实际调用参数是右值时,如果直接传递参数将会报错。
-
由于含有模板元编程,使用时一定要显式模板参数,
template<typename T> T&& func(T&& a){ return a;//a是T类型,不能赋值给右值返回值T&& return std::forward(a);//不能正确推断 return std::forward<T>(a);//(o゜▽゜)o☆[BINGO!] }
原理利用了模板元编程,但是解决的问题似乎和利用了模板参数包的函数模板有关。 (还是没搞醒所以先跳了,模板元编程大概率也学不会)
-
-
零初始化 零初始化是为了解决内置类型和自定义类型在初始化时的不同表现,即内置类型存在仅声明。
MyClass myClass;//此后myClass可以使用。 int i;//若使用了i将会造成未初始化错误。 MyClass myClass();MyClass myClass = MyClass();//自定义类型有两种初始化方式。 int i = int();//内置类型只有一种。 template<typename T> ...{ T x = T();//函数模板定义变量的零初始化写法。 } template<typename T> class MyClass{ T x; MyClass():x(){...};//确保所有成员变量都有初值。 };零初始化特性在后面提到初始化列表时有更多内容。
-
字符串转换 也称作array-to-pointer或decay,非引用类型自动推断会将字符串降至常指针,包括auto和实参演绎。(是好早的特性了) 字符数组
char const[N]和字符串指针const char*并不是一样的。 (实际上在模板编程中出现char[N]、char*也是可能的,因为基本类型可以赋值给其常量类型,这太糊了) (typeid().name()不能显示引用类型,所以不考虑引用了;从这里也可以看出引用类型在编译器眼里都是没有引用的)(T const& a)//调用参数 //实际调用 ("apple")/*和*/char[6] s = "apple";(s);//T推断为char[6]类型,a为char const[6]类型 const char* s = "apple";(s);//T推断为char const*,a为char const* const类型 (T& a)//调用参数 //实际调用 ("apple")//T为char const[6],a也是 char[6] s = "apple";(s);//T推断为char[6]类型,a也是!!! const char* s = "apple";(s);//T推断为const char*,a也是 (T a)//调用参数 //实际调用 ("apple")/*和*/const char* s = "apple";(s);//T推断为char const*,a也是 char[6] s = "apple";(s);//T推断为char*类型,a也是!!!(明显可以看出
char[N]定义的字符串表现十分特殊。所以需要用到它的时候不如用std::string了) 当需要定义这种情况的函数模板时,请进行必要的重载。template<typename T> ...(T const& a){...}//主模板 template<typename T> ...(T* const& a){...}//重载1 ...(char const* const& a){...}//重载2 -
基本模板 这个术语是用来区分特化与否的。基本模板指未特化的模板,前文有部分“主模板”也是基本模板。
template<typename t> class MyClass{ ... };//基本模板 template<typename t> class MyClass<...>{ ... };//非基本模板 -
指针实参 (有点多而且解释不了)
<int,33> <int*,&a> <void(*)(int),&f> <bool*,&X::b> <int X::*,&X::n> <void(),&tfunc<>> ...字符串常指针自然能作模板实参,但是字符串通常要声明为外部变量。
-
模板其他简单小知识
-
类模板成员函数访问类模板私有成员最好显式作用域限定或使用this指针,否则名称将优先查找外部定义。
-
typedef、using命名的类型,不会对实参演绎造成影响,编译器会把它们转换为原本的类型。
-
book
分类
keyboard_arrow_down
comment 评论区
star_outline 咱快来抢个沙发吧!