gpt4 book ai didi

c++ - regex_token_iterator 试图引用已删除的函数

转载 作者:行者123 更新时间:2023-11-28 01:26:24 25 4
gpt4 key购买 nike

我正在尝试使用 C++ 中的正则表达式拆分字符串。这是最低限度的重现:

#include <string>
#include <regex>

int main()
{
std::string str("abc");
std::string regex("b");
std::regex_token_iterator<std::string::const_iterator> a(str.begin(), str.end(), std::regex(regex), -1);
}

这个程序给我一个编译错误:attempting to reference a deleted function

error C2280: 'std::regex_token_iterator<std::_String_const_iterator<std::_String_val<std::_Simple_types<_Ty>>>,char,std::regex_traits<char>>::regex_token_iterator(_BidIt,_BidIt,const std::basic_regex<char,std::regex_traits<char>> &&,int,std::regex_constants::match_flag_type)': attempting to reference a deleted function

但我觉得我已经正确设置了它。为什么会出现此错误?我需要更改什么才能使其编译?

我从 this gist 开始工作作为示例,但我也无法编译它。

我正在使用 Microsoft Visual Studio 2017 15.8.4 进行构建

最佳答案

regex 作为临时对象的构造函数被删除,因为迭代器不复制 regex 但保留对该对象的引用。这个删除的函数是为了防止将临时对象传递给迭代器。如果您将临时对象传递给迭代器,您将获得悬空引用。

根据 reference :

regex_token_iterator( BidirectionalIterator a, BidirectionalIterator b,
const regex_type&& re,
int submatch = 0,
std::regex_constants::match_flag_type m =
std::regex_constants::match_default ) = delete;

所以您需要做的是将正则表达式创建为L-value 对象:

  std::string str("abc");
std::string regex("b");
std::regex r(regex);
std::regex_token_iterator<std::string::const_iterator> a(
str.begin(), str.end(), r, -1);

关于您发布的链接,删除了引用 R 值的重载自 C++14 以来引入,在 C++11 中有重载需要 const regex_type& re - 所以是临时的正则表达式的对象可以传递给迭代器的构造函数,但它会导致未定义的行为

关于c++ - regex_token_iterator 试图引用已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53582365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com