Рассмотрим метод, возвращающий std::string_view
либо из метода, возвращающего const std::string&
, либо из пустой строки. К моему удивлению, написание метода таким образом приводит к просмотру висячей строки:
const std::string& otherMethod();
std::string_view myMethod(bool bla) {
return bla ? otherMethod() : ""; // Dangling view!
}
Кажется, что компилятор сначала помещает временную std::string
копию результата otherMethod()
в стек, а затем возвращает представление этой временной копии вместо того, чтобы просто возвращать представление ссылки. Сначала я подумал об ошибке компилятора, но и G++, и clang делают это.
Исправить это легко: обертывание otherMethod
в явную конструкцию string_view
решает проблему:
std::string_view myMethod(bool bla) {
return bla ? std::string_view(otherMethod()) : ""; // Works as intended!
}
Почему это так? Почему исходный код создает неявную копию без предупреждения?