gpt4 book ai didi

c++ - Visual Studio regex_iterator 错误?

转载 作者:可可西里 更新时间:2023-11-01 17:36:52 26 4
gpt4 key购买 nike

我在使用 Visual Studio 2013,我看到了一个我认为是错误的东西,我希望有人可以确认吗?

string foo{ "A\nB\rC\n\r" };
vector<string> bar;

for (sregex_iterator i(foo.cbegin(), foo.cend(), regex("(.*)[\n\r]{1,2}")); i != sregex_iterator(); ++i){
bar.push_back(i->operator[](1).str());
}

此代码在 Visual Studio 正则表达式库中命中调试断言:

regex_iterator orphaned

如果我在 for 循环之外定义 regex 没问题:

string foo{ "A\nB\rC\n\r" };
vector<string> bar;
regex bug("(.*)[\n\r]{1,2}");

for (sregex_iterator i(foo.cbegin(), foo.cend(), bug); i != sregex_iterator(); ++i){
bar.push_back(i->operator[](1).str());
}

或者,这在转换中工作正常,如 this question 所示。 :

string foo{ "A\nB\rC\n\r" };
vector<string> bar;

// This puts {"A", "B", "C"} into bar
transform(sregex_iterator(foo.cbegin(), foo.cend(), regex("(.*)[\n\r]{1,2}")), sregex_iterator(), back_inserter(bar), [](const smatch& i){ return i[1].str(); });

有人可以确认这是一个错误吗?

最佳答案

在 C++11 中,您可以将临时 regex 绑定(bind)到 const regex & 如果迭代器在临时的,因为它将存储指向它的指针。这是规范中的一个缺陷,不是错误,尽管 Visual Studio 使用调试断言捕获了它。

sregex_iterator i(foo.cbegin(), foo.cend(), regex("(.*)[\n\r]{1,2}"))
^^^^^
temporary

以下已删除的重载被添加到 C++14 中以防止这种情况,来自 cppreference :

regex_iterator(BidirIt, BidirIt,
const regex_type&&,
std::regex_constants::match_flag_type =
std::regex_constants::match_default) = delete; (since C++14)

它说:

The overload 2 is not allowed to be called with a temporary regex, since the returned iterator would be immediately invalidated.

所以这不是 Visual Studio 错误,因为它正在实现 C++11 标准,并且直到后来才通过缺陷报告解决这个问题。使用 -std=c++14 或更高版本的 clanggcc 都会在您的第一个( see it live ) 和第三个 ( see it live ) 示例。 Visual Studio 在 VS 2015 中才开始支持某些 C++14 :

[...]and initial support for certain C++14 features.[...]

我们可以看到 LWG defect 2332: regex_iterator/regex_token_iterator should forbid temporary regexes处理这个:

Users can write "for(sregex_iterator i(s.begin(), s.end(), regex("meow")), end; i != end; ++i)", binding a temporary regex to const regex& and storing a pointer to it. This will compile silently, triggering undefined behavior at runtime. We now have the technology to prevent this from compiling, like how reference_wrapper refuses to bind to temporaries.

作为 T.C.指出你展示的最后一个例子实际上是好的,即使你绑定(bind)了一个临时的它的生命周期延伸到表达式的末尾。

关于c++ - Visual Studio regex_iterator 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29895747/

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