Для проверки пустоты, если вам действительно нравится буквальный синтаксис, вы можете помочь своему компилятору, using namespace std::string_literals;
и заменив ""
на ""s
. В этом случае compareWithLiteral
, compareWithRvalue
и checkForEmpty
будут по существу одинаковыми, поскольку operator==
между const std::string&
обычно проверяет размеры до содержимого, а размер ""s
является тривиальным.
bool compareWithLiteral(const std::string& target) {
using namespace std::string_literals;
return ""s == target;
}
Для строк, не попадающих в SSO, вы должны попробовать с std::string_view
и его operator""sv
, даже если, к сожалению, он доступен только с C ++ 17. Boost имеет boost::string_view
. Строковый литерал пользователя не предоставляется для создания во время компиляции (важно, поскольку длина тестовой строки будет жестко закодирована в двоичном коде), но вы можете легко определить его:
#include <boost/utility/string_view.hpp>
constexpr auto operator""_sv(const char* str, std::size_t len) noexcept {
return boost::basic_string_view<char>{str, len};
}
bool compareWithLiteral(const std::string& target) {
return "test with a longer string not optimized"_sv == target;
}
Эта версия работает намного быстрее, чем ваша compareWithLiteral
версия, по крайней мере, если target
размер отличается.