## noexcept修饰符
```cpp
void func3() throw(int, char){ //只能够抛出 int 和char类型的异常
//C++11已经弃用这个声明
throw 0;
}
void BlockThrow() throw(){ //代表此函数不能抛出异常,如果抛出,就会异常
throw 1;
}
//代表此函数不能抛出异常,如果抛出,就会异常
//C++11 使用noexcept替代throw()
void BlockThrowPro() noexcept{
throw 2;
}
```
## nullptr
空指针是不会指向有效数据的指针。以前,在C++ 的源码中使用 0 代表这种指针,但在内部的表示可能不同。这种方式有一些弊端,因为这样使得 0 既可以表示指针常量,又可表示整形常量。为了解决这个二义性的问题, C++ 11 新增了一个关键字 `nullptr` 用于表示空指针,其值类型为 `std::nullptr_t`,在语义上被理解为空指针。`nullptr`可以隐式的转化成任何类型的空指针(void* 泛型指针),以及成员函数指针和成员变量指针,而且也可以转化为 `bool` (值为 `false`),但是隐形转化到整形变量是非法的。为了向低版本兼容, C++ 11 仍允许使用 0 也即是 NULL 表示空指针因此使用 `nullptr == 0` 结果为 `true`,但是使用 `nullptr` 而不是 `0/NULL` 提供了更高的类型安全。
```cpp
void foo(int a) {
cout << __LINE__ << " a = " << a << endl;
}
void foo(int* p) {
cout << __LINE__ << " p = " << p << endl;
}
void test1() {
int* p1 = NULL;
int* p2 = nullptr;
//int a = nullptr; //err, 编译失败,nullptr不能转型为int
if (p1 == p2)
cout << "p1 == p2" << endl;
foo(p1);
foo(0);//调用foo(int), 就算写NULL,也是调用这个
foo(p2);
}
```
## 原生字符串字面值
原生字符串字面值(`raw string literal`)使用户书写的字符串“所见即所得”。C++11中原生字符串的声明相当简单,只需在字符串前加入前缀,即字母R,并在引号中使用括号左右标识,就可以声明该字符串字面量为原生字符串了,就不用考虑转义字符了。
```cpp
#include <iostream>
#include <string>
using namespace std;
int main(void) {
cout << R"(hello, \n world)" << endl;
string str = R"(helo \4 \r
abc, mike
hello\n)";
cout << endl;
cout << str << endl;
return 0;
}
```
C++11:noexcept修饰符、nullptr、原生字符串字面值