【发布时间】:2021-10-04 01:37:59
【问题描述】:
以下函数做了一些与我想要的不同的事情,即返回匹配项。如果我在vector<string>{"a b", "cd ef"} 上调用它,输出是
cd
cd ef
而不是
a b
cd ef
为什么?
#include <regex>
using namespace std;
void f(const vector<string>& v) {
vector<smatch> P{};
transform(begin(v), end(), back_inserter(P), [](auto s){
auto m = *new smatch;
regex_match(s, m, regex{"(\\S*) (\\S*) ?(.*)"});
return m;
});
for (auto s: P) cout << s[0] << endl; // debug output
}
如果我尝试不使用new:smatch m{};,情况相同。我相信我不应该这样做,因为 smatch 被分配在堆栈上,并在 lambda 函数返回时失效。 (我什至试过smatch m;,但这应该会创建一个未初始化的变量。奇怪的是,它没有运行时错误,给出相同的错误结果。)以下甚至没有编译,给出一个我不明白的错误:
#include <regex>
using namespace std;
void f(const vector<string>& v) {
vector<smatch> P{};
transform(begin(v), end(), back_inserter(P), [](auto s){
auto m = new smatch;
regex_match(s, m, regex{"(\\S*) (\\S*) ?(.*)"});
cout << (*m)[0] << endl;
return m;
});
for (auto s: P) cout << (*s)[0] << endl;
}
【问题讨论】:
-
另外:
vector<smatch> P{};和smatch m{};中的{}是否必要?我是否正确,否则变量未初始化并可能导致运行时错误? -
vector<smatch> P{};和smatch m{};与此处的vector<smatch> P;和smatch m;相同。
标签: c++ object lambda return-value transformation