我有一些使用
std::string_view
的简单代码,它在 gcc10 中运行良好,但在 gcc8 中不起作用。
std::string_view
已添加到GCC 7中的C++17中,所以应该可以使用它。
#include <string_view>
using sv = std::string_view;
sv ParseScheme(const sv& url)
{
sv pattern = "://";
if (auto found = url.find(pattern); found != sv::npos)
{
return sv(url.begin(), url.begin() + found);
}
return sv();
}
编译给了我:
$ g++ main.cpp --std=c++17 -Werror
main.cpp: In function 'sv ParseScheme(const sv&)':
main.cpp:9:44: error: invalid conversion from
'std::basic_string_view<char>::const_iterator' {aka 'const char*'} to
'std::basic_string_view<char>::size_type' {aka 'long unsigned int'} [-fpermissive]
return sv(url.begin(), url.begin() + found);
~~~~~~~~~~~~^~~~~~~
In file included from main.cpp:1:
/usr/include/c++/8/string_view:105:56: note: initializing argument 2 of
'constexpr std::basic_string_view<_CharT, _Traits>::basic_string_view(
const _CharT*, std::basic_string_view<_CharT, _Traits>::size_type
) [with
_CharT = char;
_Traits = std::char_traits<char>;
std::basic_string_view<_CharT, _Traits>::size_type = long unsigned int
]'
basic_string_view(const _CharT* __str, size_type __len) noexcept
~~~~~~~~~~^~~~~
我实际上做错了什么,还是 gcc8 中的
string_view
刚刚损坏了?
我可以使用
-fpermissive
忽略该问题,但我们使用 -Werror
进行编译,因此 -fpermissive
警告无论如何都会使构建失败。
这里使用的
string_view(Iterator,Iterator)
构造函数是C++20中添加的。这就是为什么它在 gcc8 中不起作用。
另一种方法是使用 C++17 中可用的
string_view(const char*, size_type)
构造函数:
#include <string_view>
using sv = std::string_view;
sv ParseScheme(const sv& url)
{
sv pattern = "://";
if (auto found = url.find(pattern); found != sv::npos)
{
return sv(url.data() + found, url.size() - found);
}
return sv();
}