Чтобы ответить на вопрос
Это безопасно? Или темп уничтожается до того, как будет построен QString
?
QString UUId::toString () const
{
return to_string (_uuid).c_str();
}
Это безопасно .
Как уже упоминалось в OP, результат std::string::c_str()
действителен только до тех пор, пока соответствующий std::string
не изменен (включая не удаленный).
Функция должна возвращать QString
, а return
вызывается с const char*
. Компилятор примет его, если найдет преобразование из const char*
в QString
. При определенных условиях это будет:
Qstring :: QString (const char * str)
Создает строку, инициализированную с помощью 8 -битовая строка str. Указанный указатель const char преобразуется в Unicode с помощью функции fromUtf8 ().
Вы можете отключить этот конструктор, определив QT_NO_CAST_FROM_ASCII при компиляции ваших приложений. Это может быть полезно, если вы хотите убедиться, что все видимые пользователю строки go через QObject :: tr (), например.
Итак, вопрос сводится к:
Имеет ли std::string
, возвращенный из to_string()
, достаточно долго, чтобы передать конструктору QString
указатель на его внутреннюю необработанную строку?
Да.
Из cppreference - Время жизни временного объекта :
Все временные объекты уничтожаются на последнем этапе оценки полного выражения, которое (лексически) содержит точку, в которой они были созданы, и если было создано несколько временных объектов, они уничтожаются в порядке, противоположном порядку создания. Это верно, даже если эта оценка заканчивается выдачей исключения.
Полное выражение в данном случае to_string (_uuid).c_str()
(т.е. все после return
и до ;
).
Чтобы сделать это немного более явным и надежным (например, независимо от того, определено ли QT_NO_CAST_FROM_ASCII
или нет), я бы написал его как:
QString UUId::toString() const
{
return QString::fromUtf8(to_string(_uuid).c_str());
}
но
QString UUId::toString() const
{
return QString::fromStdString(to_string(_uuid));
}
должно быть довольно эквивалентным, потому что это также предполагает закодированное в UTF-8 содержимое переданного аргумента. ( QString :: fromStdString () )