當我運行下面的代碼:爲什麼C++標準庫運算符接受rvalues?
std::string myString = "I'm a string.";
const std::string::iterator &myIterator = ++myString.begin();
char c = *myIterator;
std::cout << c << std::endl;
我得到一個分段錯誤(O3帶編譯優化)。我認爲這是因爲++
運營商返回std::string::iterator &
而不是std::string::iterator
,所以我們得到一個臨時的參考。有沒有原因爲什麼這不會導致編譯錯誤?也就是說,爲什麼不是簽名以下?
std::string::iterator &std::string::iterator::operator++() &;
甚至更好,爲什麼不規範需要以下特徵,使我們能夠處理沒有問題,右值?
std::string::iterator &std::string::iterator::operator++() &;
std::string::iterator std::string::iterator::operator++() &&;
[無法重現](https://ideone.com/I9Z8De)。你確定這是因爲這些線?在附註中,即使'++'返回引用,'myIterator'也不是引用,因此它將複製值 – Rakete1111
這工作正常。你能發佈完整的代碼嗎? – Sumeet
是的,你是對的。我修改了這個例子,它現在應該會崩潰。 –