从 initializer_list 构造 string_views 的向量

mar*_*ark 8 c++ gcc c++20

我试图构建vectorstring_view距离Sinitializer_list< const char * >这对GCC 9效果不错,但更新至GCC 10后,在运行时崩溃。

#include <vector>
#include <string_view>
#include <cstdio>

int main()
{
    std::vector< std::string_view > const v { { "Before.", "Afterrrrrr." } };
    printf( "%s %zu\n", v[0].data(), v[0].length() );
    printf( "%s %zu\n", v[1].data(), v[1].length() );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Clang 也处理代码,好吧,什么给出了?

链接:https : //godbolt.org/z/6s1c61

Ted*_*gmo 5

在这个变量定义中

std::vector< std::string_view > const v { { "Before.", "Afterrrrrr." } };
Run Code Online (Sandbox Code Playgroud)

你不小心使用了这个新的 C++20string_view构造函数:

template<class It, class End>
constexpr basic_string_view(It first, End last);
Run Code Online (Sandbox Code Playgroud)

因此,您只需使用 的开始 作为结束迭代器来构造一个迭代器。 这使得程序具有未定义的行为。string_view"Afterrrrrr."

这将是正确的方法:

std::vector< std::string_view > const v { "Before.", "Afterrrrrr." };
Run Code Online (Sandbox Code Playgroud)

  • 使用 `-std=c++17` 后问题也随之消失。构造函数被添加到[本次提交](https://github.com/gcc-mirror/gcc/commit/8857080c81761eb1344c3b5404b5e25e9cc949eb)中的libstdc++中,它实现了[P1391R4](http://www.open-std.org/jtc1 /sc22/wg21/docs/papers/2019/p1391r4.pdf)。 (3认同)