Где эта ошибка absl :: StrCat происходит, в Abseil или MSVC?

Я создал 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


Обновить

В соответствии с Альгирдас Преиджюс а также Ганс ПассантКомментарий ниже, после изменения компилятора 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])'

золотая стрела 2

0

Решение

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,

1

Другие решения

Других решений пока нет …