NulledPointer NulledPointer - 1 year ago 126
C++ Question

Is this c++ template param deduction incorrect?

#include <iostream>
#include <regex>
int main(void)
std::cmatch cm;
std::regex_match("subject", cm, std::regex("(sub)(.*)"));
//std::for_each(cm.begin(), cm.end(), [](const std::sub_match<const char *> &s){ <---- Working statement

std::for_each(cm.begin(), cm.end(), [](const std::cmatch &s){ /*<--- Non-working statement*/
std::cout << "match:" << s.str() <<std::endl;
return 0;

The error is as following:

/Applications/ error: no matching function for call to object of type '(lambda at main.cpp:73:41)'
main.cpp:73:10: note: in instantiation of function template specialization 'std::__1::for_each<std::__1::__wrap_iter<const std::__1::sub_match<const char *> *>, (lambda at main.cpp:73:41)>' requested here
std::for_each(cm.begin(), cm.end(), [](const std::match_results<const char*> &s){
main.cpp:73:41: note: candidate function not viable: no known conversion from 'const std::__1::sub_match<const char *>' to 'const std::match_results<const char *>' for 1st argument
std::for_each(cm.begin(), cm.end(), [](const std::match_results<const char*> &s){
maintool.cpp:73:41: note: conversion candidate of type 'void (*)(const std::match_results<const char *> &)'
1 error generated.

In non-working example why is template deduced as
std::__1::for_each<std::__1::__wrap_iter<const std::__1::sub_match<const char *> *>

I was expecting param will be deduced to be

Can you please explain how param deduction is working here?

Answer Source

std::cmatch is an alias for std::match_results<char const*>; you want std::sub_match<char const*>, whose alias is std::csub_match.

std::for_each(cm.begin(), cm.end(), [](const std::csub_match &s) { ... }
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download