C++11:一些微小的變化(新的資料型別、template表示式內的空格、nullptr、std::nullptr_t)

江南、董少發表於2020-03-18
  • 本文介紹一些C++的兩個新特性,它們雖然微小,但對你的程式設計十分重要

一、新的資料型別

  • C++11新增的新的資料型別如下:
    • char16_t、char32_t
    • long long、unsigned long long
    • std::nullptr_t(下面詳細介紹)

二、Template表示式內的空格

  • C++11標準之前建議在“在兩個template表示式的閉符之間放一個空格”的要求已經過時了
  • 例如:
vector<list<int> >; //C++11之前

vector<list<int>>;  //C++11

三、nullptr

  • C++11允許你使用nullptr取代0或NULL,用來表示一個pointer(指標)指向所謂的no value
  • nullptr會被自動轉換為各種pointer型別,但是不會被轉換為任何證書型別

演示案例

void f(int);
void f(void*);

f(0);       //呼叫f(int)
f(NULL);    //如果NULL被視為0,那麼呼叫的是f(int),可能與你的預期不符
f(nullptr); //呼叫f(void*)
  • 下面是在VS 2015上面的執行結果 

三、std::nullptr_t

  • std::nullptr_t是一種基礎資料型別,定義於<sctddef>中
  • std::nullptr_t定義的變數必須初始化
  • nullptr屬於一種常量,它是屬於std::nullptr_t資料型別的

演示案例

 

void f(int) {
    std::cout << "int" << std::endl;
}
void f(void*) {
    std::cout << "void*" << std::endl;
}
void f(std::nullptr_t) {
    std::cout << "std::nullptr_t" << std::endl;
}

int main()
{
    f(0);
    f(NULL);
    f(nullptr);

    //必須初始化
    std::nullptr_t t = nullptr;
    f(t);

    return 0;
}

相關文章