瑣碎c++1

繼上一篇瑣碎c++足部整理在c++中遇到有意思的應用(自己感覺c++的程序原腦子都態他媽好了,這樣的應用都能想出來)

關於c++11中的線程

void fun(string const& t1);
void oops(int some_param)
{
    std::thread t(fun, "hello");
    t.detach();
}
  • 在std::thread(fun,string)中由於fun(string const t1)中參數是string類型的,但是你想直接像std::thread(fun,”hello”),這樣的方式調用的話,可能會發生意想不到問題(原因:“hello”其實是const char *類型的,當本地const char *傳遞到新的線程中,函數有可能在轉化爲string對象完成之前奔潰,這樣就會導致一些未定義的行爲),這時候就需要顯示的轉化,如下
void fun(string const& t1);
void oops(int some_param)
{
    std::thread t(fun, std::string("hello"));
    t.detach();
}
  • 如上的轉化在需要傳引用的時候也是有必要的(即使你的回調函數的參數是應用類型)!引用的顯示轉化代碼如下:
std::ref(data);

關於Rcalue和Lvalue Reference的重載規則

  • 如果你只實現void foo(X&);而沒有實現void foo(X&&);
    行爲如同c++98;foo()可因lvalue但不可因rvalue被調用。
  • 實現:void foo(const X&);
    未實現:void foo(X&&);
    行爲:如同c++98,foo()可因lvalue也可因rvalue被調用。
  • 實現:void foo(X&); void foo(X&&); 或者
    void foo(const X&); void foo(X&&);
    行爲:你可以區分“爲rvalue服務”和“爲lvalue服務”的版本被允許且應該提供move語義。也就是說,它可以“偷取”實參的內部狀態和資源。
  • 實現:void foo(X&&);
    未實現:void foo(X&&); void foo(const X&);
    行爲:foo()可因rvalue被調用,但是當你嘗試以lvalue調用它,會觸發編譯錯誤。因此,這裏只提供move()語義。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章