Сообщение Re[21]: Концепция умного C++ от 30.04.2025 20:00
Изменено 01.05.2025 13:33 serg_joker
Re[21]: Концепция умного C++
Здравствуйте, B0FEE664, Вы писали:
BFE>
`v6` — самый подлый, остальные, в принципе, понятно, что получится, хоть и визуальные различия на v2 и v3 реально можно влёгкую пропустить (благо, в большинстве случаев компиляция отвалится дальше, т.к. тип элементов контейнера будет не такой, как ожидалось.
в пример, для ещё лучшего осознания красот двухпараметровой инициализации, можно добавить,
и ещё прикольнее, если тип конструируемой сущности и аргументов конструктора — параметр шаблона типа
Какой вариант правильнее, (1) или (2)? Вроде как (2) кошернее, если там хочешь сужающих преобразований типов избежать, к примеру, ну и вообще, "Uniform" жеж. Но если T — вектор, к примеру, тады ой.
Когда vector виден в коде явно — ещё можно на опыте среагировать на то, что {} может делать не то, что от него ожидал автор. А вот в шаблоне — уже нужно напрячься.
Короче, при всей моей любви к C++, не могу не согласиться, что инициализацию сложно назвать элегантной. Возможно, самое элегантное, что можно было придумать в связи с появлением новых видов инициализации при необходимости иметь обратную совместимость, но от этого элегантности больше не становится.
BFE>
BFE> std::vector<int> v1(5, 1);
BFE> std::vector v2(v1.begin(), v1.end());
BFE> std::vector v3{v1.begin(), v1.end()};
BFE> const char* a = "a";
BFE> const char* b = "b";
BFE> std::vector<const char*> v4(a, b);
BFE> std::vector<const char*> v5{a, b};
BFE> std::vector v6("a", "b");
BFE>`v6` — самый подлый, остальные, в принципе, понятно, что получится, хоть и визуальные различия на v2 и v3 реально можно влёгкую пропустить (благо, в большинстве случаев компиляция отвалится дальше, т.к. тип элементов контейнера будет не такой, как ожидалось.
в пример, для ещё лучшего осознания красот двухпараметровой инициализации, можно добавить,
std::vector v7(a, b);
std::vector v8(b, a);и ещё прикольнее, если тип конструируемой сущности и аргументов конструктора — параметр шаблона типа
template<typename T, typename... ARG>
auto construct(const T&, ARG&&... arg)
{
T ret( std::forward<ARG>(arg)...); // (1)
T ret{ std::forward<ARG>(arg)...}; // (2)
// do some processing, registration of `ret` etc
return ret;
}Какой вариант правильнее, (1) или (2)? Вроде как (2) кошернее, если там хочешь сужающих преобразований типов избежать, к примеру, ну и вообще, "Uniform" жеж. Но если T — вектор, к примеру, тады ой.
Когда vector виден в коде явно — ещё можно на опыте среагировать на то, что {} может делать не то, что от него ожидал автор. А вот в шаблоне — уже нужно напрячься.
Короче, при всей моей любви к C++, не могу не согласиться, что инициализацию сложно назвать элегантной. Возможно, самое элегантное, что можно было придумать в связи с появлением новых видов инициализации при необходимости иметь обратную совместимость, но от этого элегантности больше не становится.
Re[21]: Концепция умного C++
Здравствуйте, B0FEE664, Вы писали:
BFE>
`v6` — самый подлый, остальные, в принципе, понятно, что получится, хоть и визуальные различия на v2 и v3 реально можно влёгкую пропустить (благо, в большинстве случаев компиляция отвалится дальше, т.к. тип элементов контейнера будет не такой, как ожидалось.
в пример, для ещё лучшего осознания красот двухпараметровой инициализации, можно добавить,
и ещё прикольнее, если тип конструируемой сущности и аргументов конструктора — параметр шаблона типа
Какой вариант правильнее, (1) или (2)? Вроде как (2) кошернее, если там хочешь сужающих преобразований типов избежать, к примеру, ну и вообще, "Uniform" жеж. Но если T — вектор, к примеру, тады ой.
Когда vector виден в коде явно — ещё можно на опыте среагировать на то, что {} может делать не то, что от него ожидал автор. А вот в шаблоне — уже нужно напрячься.
Короче, при всей моей любви к C++, не могу не согласиться, что инициализацию сложно назвать элегантной. Возможно, самое элегантное, что можно было придумать в связи с появлением новых видов инициализации при необходимости иметь обратную совместимость, но от этого элегантности больше не становится.
BFE>
BFE> std::vector<int> v1(5, 1);
BFE> std::vector v2(v1.begin(), v1.end());
BFE> std::vector v3{v1.begin(), v1.end()};
BFE> const char* a = "a";
BFE> const char* b = "b";
BFE> std::vector<const char*> v4(a, b);
BFE> std::vector<const char*> v5{a, b};
BFE> std::vector v6("a", "b");
BFE>`v6` — самый подлый, остальные, в принципе, понятно, что получится, хоть и визуальные различия на v2 и v3 реально можно влёгкую пропустить (благо, в большинстве случаев компиляция отвалится дальше, т.к. тип элементов контейнера будет не такой, как ожидалось.
в пример, для ещё лучшего осознания красот двухпараметровой инициализации, можно добавить,
std::vector v7(a, b);
std::vector v8(b, a);и ещё прикольнее, если тип конструируемой сущности и аргументов конструктора — параметр шаблона типа
template<typename T, typename... ARG>
auto construct(ARG&&... arg)
{
T ret( std::forward<ARG>(arg)...); // (1)
T ret{ std::forward<ARG>(arg)...}; // (2)
// do some processing, registration of `ret` etc
return ret;
}Какой вариант правильнее, (1) или (2)? Вроде как (2) кошернее, если там хочешь сужающих преобразований типов избежать, к примеру, ну и вообще, "Uniform" жеж. Но если T — вектор, к примеру, тады ой.
Когда vector виден в коде явно — ещё можно на опыте среагировать на то, что {} может делать не то, что от него ожидал автор. А вот в шаблоне — уже нужно напрячься.
Короче, при всей моей любви к C++, не могу не согласиться, что инициализацию сложно назвать элегантной. Возможно, самое элегантное, что можно было придумать в связи с появлением новых видов инициализации при необходимости иметь обратную совместимость, но от этого элегантности больше не становится.