std :: regex_match在传递rvalues参数时给出错误匹配结果

时间:2012-06-20 09:12:11

标签: c++ visual-c++ c++11

希望有人能回答这个问题。这是一些示例代码。

namespace std {
#ifdef UNICODE
typedef wstring tstring;
typedef wstringstream tstringstream;
#define tcout std::wcout
#else
typedef string tstring;
typedef stringstream tstringstream;
#define tcout std::cout
#endif
typedef regex_iterator<std::tstring::const_iterator> TRegexIterator;
}

std::TRegexIterator::regex_type nPattern(_TEXT("-?[0-9]+(\\.[0-9]+)?((e|E)(\\+|-)[0-9]+)?"));
std::match_results<std::tstring::const_iterator> theMatches;
std::tstring test(_TEXT("-1.323E-23"));

tcout << _TEXT("Lvalue target string") << std::endl;
if (std::regex_match(test, theMatches, nPattern))
{
    for (auto i= 0; i < theMatches.size(); ++i)
        tcout << theMatches[i] << std::endl;
}

tcout << _TEXT("Rvalue target string") << std::endl;
if (std::regex_match(std::tstring(_TEXT("-1.323E-23")), theMatches, nPattern))
{
    for (auto i= 0; i < theMatches.size(); ++i)
        tcout << theMatches[i] << std::endl;
}

好的,我得到的问题是第一个与右值目标字符串匹配的结果是
“1.323E-23”(是的,带有起始空间)而不是预期的“-1.323E-23”。我在想它是因为“std :: match_results”存储指针而不是数据,但在这种情况下,为什么“std :: regex_match”的第一个参数是“const std :: string&amp;”? (这是我从Intellisense验证的)。一个“std :: string&amp;”看起来更合适。 我正在使用VS11 beta C ++编译器。

1 个答案:

答案 0 :(得分:0)

是,

  

这是因为“std :: match_results”存储指针而不是数据。

例如,测试下面的代码:

tcout << _TEXT("Lvalue target string") << std::endl;
if (std::regex_match(test, theMatches, nPattern))
{
    test = _TEXT(""); // change 'test' to invalidate 'theMatches' pointers
    for (auto i= 0; i < theMatches.size(); ++i)
        tcout << theMatches[i] << std::endl; // MEMORY ERROR!!!
}

但是,为什么你相信

  

“std :: string&amp;”看起来比“const std :: string&amp;”更合适。

在我看来“const std :: string&amp;”看起来更合适,因为'std :: regex_match'不需要更改此参数。