Sind Spirit-Parser nicht für die Verwendung mit auto
vorgesehen?Zuweisen von Parsern zu automatischen Variablen
Ein einfacher Parser funktioniert gut, wenn zu qi::parse()
Inline vergangen, aber stürzt mit segfault wenn über eine auto
Variable übergeben:
#include <cstdio>
#include <string>
#include <boost/spirit/include/qi.hpp>
using namespace std;
namespace qi = boost::spirit::qi;
int main()
{
string line = "[z]";
auto bracketed_z = '[' >> +qi::char_('z') >> ']';
auto p = line.cbegin();
printf("%d", qi::parse(p, line.cend(), '[' >> +qi::char_('z') >> ']')); // Works
p = line.cbegin();
printf("%d", qi::parse(p, line.cend(), bracketed_z)); // Crashes
}
Reproes mit g ++ - 4.8 und VC13.
Update: Fehler in dem Original-Code festgelegt wurden (p
wurde nicht neu initialisiert vor dem zweiten Aufruf parse()
).
Wie kann jeder C++ Parser mit 'auto' umgehen? Parser sollen bestimmte Typen lesen, die zur Laufzeit bestimmt werden, 'automatische' Typen werden zur Kompilierungszeit aufgelöst. Also IMHO, außer das 'auto' resultiert in' boost :: variant' oder 'boost :: any' ist nicht möglich. –
Beachten Sie, dass der erste Iterator als Referenz (IIRC) übergeben wird. Das heißt, "p" wurde nach dem ersten Aufruf von 'qi :: parse' geändert. – dyp
Danke, @dyp. Der Fehler wurde behoben. – mstone