#include namespace { struct any { template any(const T &); }; template decltype(operator*(std::declval(), std::declval()), std::true_type()) help_are_multiplicable(A, B); std::false_type help_are_multiplicable(any, any); template class are_multiplicable : public decltype(help_are_multiplicable(std::declval(), std::declval())) { }; } namespace { template decltype(operator/(std::declval(), std::declval()), std::true_type()) help_are_divisible(A, B); std::false_type help_are_divisible(any, any); template class are_divisible : public decltype(help_are_divisible(std::declval(), std::declval())) { }; } static_assert(!are_divisible::value, "OK"); static_assert(!are_multiplicable::value, "fails"); // expect-error