首页 > 解决方案 > 从 initializer_list 构造 string_views 的向量

问题描述

我正在尝试从一个在 GCC 9 上运行良好的 a vectorof string_views构建一个,但是在更新到 GCC 10 之后它在运行时崩溃。initializer_list< const char * >

#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;
}

Clang 还可以处理代码,什么给出?

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

标签: c++gccc++20

解决方案


在这个变量定义中

std::vector< std::string_view > const v { { "Before.", "Afterrrrrr." } };

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

template<class It, class End>
constexpr basic_string_view(It first, End last);

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

这将是正确的方法:

std::vector< std::string_view > const v { "Before.", "Afterrrrrr." };

推荐阅读