https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63198
--- Comment #6 from Thomas Bernard <thomas at famillebernardgouriou dot fr> --- The assignment operator is an operator which always has side effects. That is why it is considered dependent during template definitions to prevent early instanciations of code. By adding a typename before the decltype, everything is fine. Trying to add the typename implicitly works well to solve this small test case. However, using the Spirit X3 code, it only moves the problem. The template function overload doesn't get resolved correctly, so there must be some other solution that is more appropriate. Figuring out what exactly is going wrong was above my capacities, so I'll leave this to the pros.