Ответ 1
Из моего понимания поиска ADL функция-член в comma_guard должна быть предпочтительной и поэтому не должна быть двусмысленной. Правильно ли это?
Ответ: Во время разрешения перегрузки и согласно стандарту § 13.3.1/2 и 7 Функции кандидата и списки аргументов [over.match.funcs]:
2
Набор функций-кандидатов может содержать как функции-члены, так и не-члены, которые должны быть разрешены в отношении одного и того же списка аргументов.
7
В каждом случае, когда кандидат является шаблоном функции, специализированные шаблоны функций кандидата генерируются с использованием вычитания аргумента шаблона (14.8.3, 14.8.2). Затем эти кандидаты обрабатываются как функции кандидата обычным способом [126].[footnote
126
] Процесс вывода аргумента полностью определяет типы параметров специализированных шаблонов, т.е. параметры специализированных шаблонов шаблонов не содержат типов параметров шаблона. Следовательно, за исключением тех случаев, в противном случае функции шаблонов функций и функции без шаблона (8.3.5) обрабатываются эквивалентно для остальной части разрешения перегрузки.
Следовательно, оператор с перегрузкой элемента шаблона не имеет большего приоритета с точки зрения выбора разрешения перегрузки, чем оператор с произвольным перегрузкой шаблона.
Даже если он имел GCC, выбирает бесплатный шаблонный перегруженный оператор LIVE DEMO.
Итак, по моему скромному мнению, здесь есть GCC, который показывает нестандартное поведение, и Кланг справедливо жалуется на неоднозначность разрешения перегрузки.
Кроме того, есть ли способ обхода, чтобы оператор в команде comma_guard всегда был предпочтительнее?
Ответ: Да хотя и довольно уродливый: (comma_guard().operator,(foo()));
LIVE DEMO