Когда я пытаюсь скомпилировать эту тестовую программу:
struct comma_guard
{
template<class T>
const comma_guard& operator,(T&&) const
{
return *this;
}
};
struct foo {};
template<class T> T operator,(T x, foo)
{
return x;
}
int main()
{
(comma_guard(), foo());
}
Я получаю ошибку компиляции clang:
comma_guard.cpp:20:19: error: use of overloaded operator ',' is ambiguous (with operand types 'comma_guard' and 'foo')
(comma_guard(), foo());
~~~~~~~~~~~~~^ ~~~~~
comma_guard.cpp:6:24: note: candidate function [with T = foo]
const comma_guard& operator,(T&&) const
^
comma_guard.cpp:13:21: note: candidate function [with T = comma_guard]
template<class T> T operator,(T x, foo)
^
Это компилирует штраф на gcc. Из моего понимания поиска ADL функция-член в comma_guard
должна быть предпочтительной и поэтому не должна быть двусмысленной. Это верно? Это ошибка в clang? Кроме того, существует ли временное решение, чтобы оператор в comma_guard
всегда был предпочтительнее?
Обновление. Таким образом, кажется, что clang не считает его членом класса при его шаблоне. Поэтому, если я определяю comma_guard
следующим образом, он будет работать:
struct comma_guard
{
struct any
{
template<class T>
any(T&&);
};
const comma_guard& operator,(any) const;
};
Что правильно в соответствии с С++?