《Effective Modern C++》学习记录(三):小特性2
1 限域enum用法:
1enum class 枚举名 {...};
1.1 优点
避免枚举名泄露
1234567891011//不限域enum Color {black, white, red};auto white = false; //错误,white在当前作用域被定义过//限域enum class Color {black, white, red}; //black,white,red只在Color域内auto white = false; //没错Color c = white //错误,此时域内没有枚举名叫white//此时需要这样定义枚举Color c = Color::white;auto c = Color::white;
限域enum在其作用域中是强类型,而不限域的enum会隐式转换为整型甚至浮点型导致扭曲的效果。
12345678enum Color { black, white, red }; primeFactors(std::size_t x); Color c = r ...
《Effective Modern C++》学习记录(二):小特性1
1 统一初始化/花括号初始化uniform initialization1.1 特性一:可以在任何地方初始化非静态成员变量可以用花括号初始化
12345678class Widget(){private: int x{ 0 }; //可以 int y = 0; //可以 //成员变量不可以用小括号初始化,有二义性,可能会被认为是函数声明 int z(0); //错误}
对于不可拷贝的对象进行初始化,也可以用花括号初始化(原子对象不可拷贝)
1234std::atomic<int> ai1{ 0 }; //可以std::atomic<int> ai2(0); //可以//不可拷贝的对象不可以用=初始化std::atomic<int> ai3 = 0; //错误
1.2 特性二:不允许内置类型间隐式的变窄转换1234double x, y, z;int sum1{ x + y + z }; //错误,不能编译通过int sum2(x + y + z); //可以 ...
《Effective Modern C++》学习记录(一):类型推导
1 模板推导规则1.1 函数的形参是一个指针或引用但不是通用引用
函数模板推导时,推导出的T会省略函数模板中形参类型有的部分(const、*、&)。
实参类型有,函数模板中形参类型没有的部分,推导出的T则会保留这一部分。
最后推导出的param的类型,将会是实参类型和函数模板中形参类型的并集。
demo:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include <iostream>#include <boost/type_index.hpp> //主要通过boost库来打印完整的数据类型template<typename T>void test1(T& param){ std::cout<< "T:" << boost::typeindex::type_id_with_cvr<T>().pretty_name() ...