Peter Steinberger просто написал твиттер о частном уведомлении UIWindowFirstResponderDidChangeNotification
, который вы можете наблюдать, если хотите посмотреть изменение первого ретранслятора.
Возвращенный указатель может быть признан недействительным при последующих вызовах других функций-членов, которые модифицируют объект.
blockquote>
Если происходит перераспределение, все содержащиеся в нем элементы модифицируются.
blockquote>
Поскольку нет способа узнать, произойдет ли перераспределение
vector
при вызовеemplace_back
, вы должны предположить, что последующее использование более раннего возвращаемого значения изstring::c_str()
приводит к неопределенное поведение.Так как неопределенное поведение - неопределенное - может произойти все что угодно. Следовательно, может показаться, что ваш код работает или не работает. В любом случае, это ошибка.
Это неопределенное поведение (UB), означающее, что может произойти все что угодно, включая работающий код. Это UB, потому что emplace_back
делает недействительными все указатели на объекты в векторе. Это происходит потому, что вектор может быть перераспределен (что, очевидно, так и есть).
Первый случай UB «не работает» из-за оптимизации короткой строки (sso). Из-за sso необработанный указатель указывает на память, непосредственно выделенную вектором, которая теряется после перераспределения.
Второй случай UB «работает», потому что текст строки слишком длинный для SSO и находится в независимом блоке памяти. Во время изменения размера строковый объект перемещается из, перемещая владельца блока памяти текста во вновь созданный строковый объект. Поскольку блок памяти просто меняет владельца, он остается в силе после emplace_back
.