2016-01-24 126 views
2

這是第一個發言:這兩個sregex_iterator語句之間爲什麼有區別?

string s("hello.world"); 
sregex_iterator pos(s.cbegin(), s.cend(), regex(R"(\.)")); 
sregex_iterator end; 
for (; pos != end; ++pos) 
    cout << pos->str() << endl; 

這是第二次聲明:

string s("hello.world"); 
regex reg(R"(\.)"); 
sregex_iterator pos(s.cbegin(), s.cend(), reg); 
sregex_iterator end; 
for (; pos != end; ++pos) 
    cout << pos->str() << endl; 

第二程序可以正常運行,但第一中止在運行時。 enter image description here

+0

https://en.wiktionary.org/wiki/orphan –

+0

@LightnessRacesinOrbit可憐的小迭代:( – Drop

回答

2

在這一行:

sregex_iterator pos(s.cbegin(), s.cend(), regex(R"(\.)")); 

表達regex(R"(\.)")對應於正被後函數調用立即銷燬臨時對象。所有「指向」它的迭代器都將失效。嘗試使用此迭代器會導致失敗的調試運行時檢查和斷言被拋出。

參見:

+0

和錯誤消息說,這個迭代器有被孤兒。 –

相關問題