ideas icon indicating copy to clipboard operation
ideas copied to clipboard

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

Open sigasigasiga opened this issue 3 years ago • 0 comments

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

в 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{ []{} };
};

sigasigasiga avatar Jul 29 '22 13:07 sigasigasiga