Does this detection idiom correctly report whether `T` has a member `.size()`? What does `has_size<std::string>::value` yield?
#include <type_traits>
template <typename T, typename = void>
struct has_size : std::false_type {};
template <typename T>
struct has_size<T, std::void_t<decltype(std::declval<T>().size())>>
: std::true_type {};