1. auto
c++11将其用于实现自动类型推断。这要求进行显示初始化,让编译器能够将变量的类型设置为初始值的类型。
auto maton = 112; // maton is type int
auto pt = &maton; //pt is type int *
double fm(double, int);
auto pf = fm; //pf is type double (*) (double, int)
关键字auto还可以简化模板声明。 例如,如果i1是一个std::initializer_list<double> 对象, 则可将下述代码:
for (std::initializer_list<double>::iterator p = i1.begin(); p != i1.end(); p++ )
替换为如下代码:
for (auto p = i1.begin(); p != i1.end(); p++)
2.decltype
关键字dectype将变量的类型声明为表达式指定的类型。
decltype(x) y; //x 是表达式, 该语句让y的类型与x相同。
double x;
int n;
decltype(x*n) q; // q的类型与x*n相同, 为double
decltype(&x) pd; //pd 的类型和&x相同, 为double *
这在定义模板时特别有用, 因为只有等到模板被实例化时才能确定类型:
template <typename T, typename u>
void ef(T t, U u)
{
decltype(T*U) tu;
...
}
tu的类型为T*U的类型, 假定定义了运算T*U, 如果T为char,U为short, 则tu将为int, 这是由整形运算自动执行整型提升导致。
3.模板别名: using =
对于冗长或复杂的标识符,如果能够创建其别名将很方便。 以前,c++为此提供了 typedef;
typedef std::vector<std::string>::iterator;
c++11提供了另一种创建别名的语法:
using itType = std::vector<std::string>iterator;
差别在于, 新语法可以用于模板部分具体化,但typedef不能:
template<typename T>
using arr12 = std::array<T,12>;
上述
语句具体化模板 array<T, int>, 例如:
std::array<double, 12> a1;
std::array<std::string, 12> a2;
可将他们替换为如下声明:
arr12<double> a1;
arr12<std::string> a2;
4. nullptr
空指针是不会指向有效数据的指针。c++11新增了关键字nullptr, 用于表示空指针, 它是指针类型, 不能转换为整数类型。 为向后兼容c++11仍允许使用0来表示空指针, 因此表达式 nullptr == 0 为true, 但使用nullptr而不是0提供了更高的类型安全。 例如, 可将0传递给接受int 参数的函数, 但如果你试图将nullptr传递给这样的函数, 编译器将此视为错误。
因此, 出于清晰和安全考虑, 请使用nullptr ——— 如果编译器支持它。
版权声明:本文为博主原创文章,未经博主允许不得转载。