GCC8 上的 std::string_view 问题

问题描述 投票:0回答:1

我有一些使用

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
警告无论如何都会使构建失败。

c++17 gcc-warning string-view
1个回答
0
投票

这里使用的

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.