標籤:

C++11引入了哪些讓人難忘的坑?

拋磚引玉一下:

vector& vecbool = {true, false, true};
auto x = vecbool[0]; // &<- oops...

vector& &> dp;
dp.resize(n);
for (auto subvec: dp) { // &<- oops... subvec.resize(m); }


vector&搭配auto這個不是坑是feature.

原因是之前引入的,非要給vector&搞個bit引用代理...

增強for循環這麼好用怎麼能是坑

for這裡用auto就好了.或者直接不寫類型for(Iter:container)現在也可以用了

要說坑,

initialist&重載和auto以及{}調用構造函數的三者混搭才是坑.

decltype()有兩種語義才是坑,1.獲得表達式計算結果2.獲得對象類型,加了括弧的一律是獲得表達式計算結果

C++11引入的記憶深刻的就這麼兩個坑吧...


隨便寫幾個:

  • 完美轉發

struct Foo {
Foo(Foo const) { cout &<&< "copy "; } template & Foo(T) { cout &<&< "forward "; } }; Foo a = 1; // forward Foo b = a; // forward too!

  • std::bind

void foo() {}

void bar(std::function& func)
{
func();
}

std::bind(bar, std::bind(foo))(); // error!

  • 初始化列表

print_size(std::vector&{5, 1}); // size = 2
print_size(std::vector&(5, 1)); // size = 5
print_size(std::vector&{5, Foo{}}); // size = 5


這坑雖然不算大,但一不小心就踩了,因為一個""實在太方便了..

搞得我現在捕獲列表只敢一個一個變數地寫:

std::function& some_fun()
{
int k=0;
return [](){ return ++k; };
}

int main()
{
std::function& fun = some_fun();
return fun(); //勇乾的燒年啊快去破壞堆棧.......
}


opps應為oops


What a language fucked by shitty programmers


我奏是覺得function好用,會影響很多開源庫的實現方式。

但是,會不會帶來額外的坑還不清楚。

模稜兩可的代碼,能不寫就不寫,或者搞清楚了再寫。


STL 的 regex_match 比 boost的 慢好多

測試大概慢10倍


推薦閱讀:

由於未能創建 Microsoft Visual C# 2015 編譯器......問題?
C++程序怎麼在鏈接期間確保一塊內存空間?
怎麼看待做手游cocos前端開發,lua用的多,c++用的少面試會被鄙視?
若要向C++之父 Bjarne Stroustrup 請教10個技術Topics,有什麼好的建議么?
將一個double類型的指針自增一次,前後的地址差是否一定為sizeof(double)?

TAG:C | CC | C11 |