我从 char 数组创建 string_view
// 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 目标 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> >
在当前的 MSVC 中,从to const std::basic_string_view<char, std::char_traits<char> >::const_pointer
(aka ) 的转换似乎const char *const
是不可能的include\xstring
Clang 和 gcc 对此很满意。
更新
根据Algirdas Preidžius和Hans Passant下面的评论,在将 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])'