Я создал string_view из массива char
// creat sv from vector;
std::vector<char> vec = { 'w', 'h', 'a', 't' };
char* char_ptr = vec.data();
size_t sz = vec.size();
std::string_view sview_obj = std::string_view(char_ptr, sz);
Если вы напишите:
using namespace std::string_view_literals;
std::cout << absl::StrCat(sview_obj, "ever") // Error
<< absl::StrCat(sview_obj, sview_obj) // Error
<< absl::StrCat("what", "ever"sv) // Error
<< absl::StrCat("what"sv, "ever"sv) // Error
<< absl::StrCat("what", "ever"); // Okey
Ошибка MSVC:
<source>(16): error C2039: 'string_view_literals': is not a member of 'std'
/opt/compiler-explorer/libs/abseil\absl/numeric/int128.h(231): note: see declaration of 'std'
<source>(16): error C2871: 'string_view_literals': a namespace with this name does not exist
<source>(18): error C2665: 'absl::StrCat': none of the 5 overloads could convert all the argument types
/opt/compiler-explorer/libs/abseil\absl/strings/str_cat.h(310): note: could be 'std::string absl::StrCat(const absl::AlphaNum &,const absl::AlphaNum &)'
<source>(18): note: while trying to match the argument list '(std::string_view, const char [5])'
<source>(19): error C2665: 'absl::StrCat': none of the 5 overloads could convert all the argument types
/opt/compiler-explorer/libs/abseil\absl/strings/str_cat.h(310): note: could be 'std::string absl::StrCat(const absl::AlphaNum &,const absl::AlphaNum &)'
<source>(19): note: while trying to match the argument list '(std::string_view, std::string_view)'
<source>(20): error C3688: invalid literal suffix 'sv'; literal operator or literal operator template 'operator ""sv' not found
<source>(21): error C3688: invalid literal suffix 'sv'; literal operator or literal operator template 'operator ""sv' not found
Кроме как operator""sv
кажется, отсутствует в MSVC,
строки 18 и 19 есть что-то общее:
std::cout << absl::StrCat(sview_obj, "ever") // Error
<< absl::StrCat(sview_obj, sview_obj) // Error
Ошибка:
<source>(18): error C2665: 'absl::StrCat': none of the 5 overloads could convert all the argument types
/opt/compiler-explorer/libs/abseil\absl/strings/str_cat.h(310): note: could be 'std::string absl::StrCat(const absl::AlphaNum &,const absl::AlphaNum &)'
<source>(18): note: while trying to match the argument list '(std::string_view, const char [5])'
Когда я компилирую на своем VC BuildTool (clang 8 target msvc), это дает дополнительные подсказки.
In file included from C:/Program Files/C++ Source/abseil-cpp/absl/strings/ascii.cc:15:
C:\Program Files\C++ Source\abseil-cpp\absl/strings/ascii.h(198,10): error: no matching constructor for initialization of 'absl::string_view' (aka 'basic_string_view<char>')
return absl::string_view(it, str.end() - it);
^ ~~~~~~~~~~~~~~~~~~
C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.13.26128\include\xstring(809,12): note: candidate constructor not viable: no known conversion from 'std::_String_view_iterator<std::char_traits<char> >' to 'const std::basic_string_view<char, std::char_traits<char> >::const_pointer' (aka 'const char *const') for 1st argument
constexpr basic_string_view(_In_reads_(_Count) const const_pointer _Cts, const size_type _Count)
^
Похоже конверсия из std::_String_view_iterator<std::char_traits<char> >
в const std::basic_string_view<char, std::char_traits<char> >::const_pointer
(ака const char *const
) невозможно в текущем MSVC include\xstring
Clang и gcc с этим согласны.
В соответствии с Альгирдас Преиджюс а также Ганс ПассантКомментарий ниже, после изменения компилятора Godbolt с MSVC 2017 RTM на MSVC Pre 2018, sv
все литералы теперь все в порядке.
Еще есть еще одна ошибка, упомянутая выше.
std::cout << absl::StrCat(sview_obj, "ever") // Error
ошибка
<source>(18): error C2665: 'absl::StrCat': none of the 5 overloads could convert all the argument types
/opt/compiler-explorer/libs/abseil\absl/strings/str_cat.h(310): note: could be 'std::string absl::StrCat(const absl::AlphaNum &,const absl::AlphaNum &)'
<source>(18): note: while trying to match the argument list '(std::string_view, const char [5])'
absl::AlphaNum
может быть создан из absl::string_view
, Но не из std::string_view
, Ваш код не может быть собран, потому что на данный момент они отличаются string_view
типы.
Причина в том, что на момент написания этого ответа макрос тестирования функции ABSL_HAVE_STD_STRING_VIEW
закомментировано. Под этим макросом absl::string_view
обозначает std::string_view
. Под макросом ваш код будет построен. Таким образом, можно сказать, что «вина» в том, что команда Abesil еще не обновила библиотеку.
Прямо сейчас, будущее решение — это использовать absl::string_view
,
Других решений пока нет …