O seguinte conceito do C++20 - The Complete Guide (adaptado de http://wg21.link/p0870 ), proíbe conversões de estreitamento. Por exemplo, float
para int
, como em 1.9f
→ 1
.
template <typename From, typename To>
concept ConvertibleWithoutNarrowing = requires (From&& from) {
{ std::type_identity_t<To[]>{std::forward<From>(from)}} -> std::same_as<To[1]>;
};
O livro usa isso para uma coleção C que não deve ter conversões de restrição ao adicionar dados:
template<typename C, typename T>
requires ConvertsWithoutNarrowing<T, typename C::value_type>
void add(C& collection, const T& val) {…}
// Usage:
std::vector<int> vec_i;
add(vec_i, 1); // OK
add(vec_i, 1.3); // Does not compile.
Entendi a ideia geral por trás do conceito, mas o que o [1]
na última parte, std::same_as<To[1]>;
, faz?