У меня есть некоторый код, который использует оператор преобразования шаблона, чтобы найти тип возвращаемого значения функции, найденной через ADL.
Упрощенный код выглядит следующим образом:
#include <type_traits>
template<typename S>
struct probe {
template<typename T, typename U = S, std::enable_if_t<
std::is_same<T&, U>::value &&
!std::is_const<T>::value, int> = 0>
operator T& ();
template<typename T, typename U = S&&, std::enable_if_t<
std::is_same<T&&, U>::value &&
!std::is_const<T>::value, int> = 0>
operator T&& ();
template<typename T, typename U = S, std::enable_if_t<
std::is_same<T const&, U>::value, int> = 0>
operator T const& () const;
template<typename T, typename U = S&&, std::enable_if_t<
std::is_same<T const&&, U>::value, int> = 0>
operator T const&& () const;
};
namespace foo {
struct bar {};
auto find_me(bar const&) -> int { return 0; }
}
int main() {
// That would be inside a template in my code.
find_me(probe<foo::bar>{});
}
В Clang 6 и GCC,вышеуказанный код компилируется.Однако в Clang 7 он больше не компилируется!
https://godbolt.org/z/Lfs3UH
Как видите, clang 6 разрешает вызов на probe<foo::bar>::operator foo::bar&&<foo::bar, foo::bar&&, 0>()
, но clang 7 завершается неудачно, потому что пытаетсяcall probe<foo::bar>::operator const foo::bar&&<const foo::bar, foo::bar&&, 0>()
Какой компилятор прав?Какое правило в стандарте для этого?Это новая ошибка Clang или это исправление?
Есть много случаев, которые я хочу проверить.Не только foo::bar
в качестве параметра, но и многие ссылочные типы, такие как этот:
namespace foo {
struct bar {};
auto find_me(bar const&) -> int { return 0; }
auto find_me(bar&&) -> int { return 0; }
auto find_me(bar const&&) -> int { return 0; }
auto find_me(bar&) -> int { return 0; }
}
int main() {
find_me(probe<foo::bar>{});
find_me(probe<foo::bar&>{});
find_me(probe<foo::bar&&>{});
find_me(probe<foo::bar const&>{});
find_me(probe<foo::bar const&&>{});
}
Важно разрешить правильный вызов функции.
Вот живой пример всех этих случаев,GCC преуспевает, но не удается лязг: https://godbolt.org/z/yrDFMg