опечатавшись написал
std::string a=a.empty()?b:a_;
вместо
std::string a=a_.empty()?b:a_;
и эта сволочь из трех букв (gcc) даже ворнинг не сказала... самое прикольное что это проработало день :-))
записи вида
T a(a);
компилит за милую душу, сволочь
[updated] по цитате а:
The point of declaration for a name is immediately after its complete declarator (clause 8) and before its
initializer (if any), except as noted below. [Example:
int x = 12;
{ int x = x; }
Here the second x is initialized with its own (indeterminate) value. ]
но gcc все равно компиляет на самом деле в код котором переменная для инициализации использует саму себя