Le code ci-dessous provient de la documentation Boost.Spirit x3 . Il utilise une syntaxe C ++ intéressante que je n'ai jamais vue auparavant, qu'il est presque impossible de décrire dans une requête de recherche sans connaître la terminologie appropriée. S'agit-il d'un raccourci pour la déclaration anticipée d'une classe? Où cette fonctionnalité est-elle mentionnée dans la norme C ++?
namespace parser
{
using x3::eps;
using x3::lit;
using x3::_val;
using x3::_attr;
using ascii::char_;
auto set_zero = [&](auto& ctx){ _val(ctx) = 0; };
auto add1000 = [&](auto& ctx){ _val(ctx) += 1000; };
auto add = [&](auto& ctx){ _val(ctx) += _attr(ctx); };
// What is this? This is the very first use of the identifier `roman`.
x3::rule<class roman, unsigned> const roman = "roman";
// ^^^^^^^^^^^
auto const roman_def =
eps [set_zero]
>>
(
-(+lit('M') [add1000])
>> -hundreds [add]
>> -tens [add]
>> -ones [add]
)
;
BOOST_SPIRIT_DEFINE(roman);
}