cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

добавить возможность использовать CTAD в контексте default member initializer #526

Open sigasigasiga opened 1 year ago

sigasigasiga commented 1 year ago

<Описание вашей идеи>

в C++17 была добавлена прекрасная фича -- class template argument deduction (CTAD), которая избавила нас от необходимости явно указывать шаблонные параметры у классов:

std::pair<int, int> before_cpp17{0, 0};
std::pair after_cpp17{0, 0};

однако по какой-то причине эта фича не работает, если использовать её в контексте default member initializer:

struct foo_t
{
    std::pair m_{0, 0}; // clang: error: use of class template 'pair' requires template arguments; argument deduction not allowed in non-static struct member
};

<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>

ярче всего это изменение будет сиять при необходимости параметризации шаблона класса лямбдой:

template<typename F>
struct function_holder_t
{
    F m_fun;
};

template<typename F> function_holder_t(F&&) -> function_holder_t<F>;

function_holder_t g_holder{ []{} }; // works just fine

struct foo_t
{
    function_holder_t</* what do we even write here? */> m_holder{ []{} };
};