У меня есть код с интерфейсом журнала, который принимает const char* только .
Мой код имеет дело со смешанной сумкой std :: string и std :: wstring из разных источников.
и, да, я знаю, что это далеко не идеал, но Давайте сосредоточимся на технических деталях. /code> в единую функцию преобразования, давайте назовем это TC_STR (t strt) , чтобы облегчить построение выражений в журнале.
Для строки реализация Прямо: < /p>
Код: Выделить всё
const char* tc_str(const std::string& str) {
return str.c_str();
}
< /code>
Для wstring я предложил следующее решение, которое работает на VS2022 afaict: < /p>
const char* tc_str(const std::wstring& wstr, std::string&& rTmpLifeExt = std::string()) {
rTmpLifeExt = wchar_to_narrow(wstr);
return rTmpLifeExt.c_str();
}
< /code>
Вот полный тестовый код.std::string narrow = ...
std::wstring wide = ...
printf("n: %s / w: %s", tc_str(narrow), tc_str(wide));
это законное C ++ 20?
в зависимости от в https://stackoverflow.com/a/12554621/321013 (ref cppref) (Ref: §12.2 [class.temporary] ; §1.9 [intro.Execution] < /code>) Связанное время эталона должно быть расширено «правильно», и не должно происходить висящие указатели: < /p>
... Специальный случай в §12.2 [class.temporary] < /code>: < /p>
p4 ... Контексты, в которых временные районы разрушаются в другой точке [...] < /p>
p5 ... Когда ссылка связана с временным. ...: < /p>
Временная связь с эталонным параметром в вызове функции (5.2.2) сохраняется до завершения полной экспрессии
, содержащий вызов < /strong>. < /li>
< /ul>
< /blockquote>
... в §1.9 [intro.excution] P11 < /code>: < /p>
[ Примечание: < /em> ... Подплексии, участвующие в оценке
аргументы по умолчанию (8.3.6) считаются созданными в выражении, которое вызывает функцию < /strong>, а не выражение, которое определяет
аргумент по умолчанию. -ind note ]
Мое самое большое сомнение было бы с R-Value против L -Воля ссылок здесь, но кажется, что они обращаются одинаково. ?
Подробнее здесь: https://stackoverflow.com/questions/794 ... -convertin
Мобильная версия