变量模板中引用的默认构造元组


template<typename... T>
struct RoundRobin
{
// Dangling references
RoundRobin() : choices{std::forward_as_tuple(T{}...)}
{}
// Expected behaviour
RoundRobin(std::in_place_t, T&... c) : choices{std::forward_as_tuple(c...)}
{}
std::tuple<T&...> choices;
};
struct Choice {};
// OK
Choice c1, c2, c3;
RoundRobin good_robin(std::in_place, c1, c2, c3);
// NOT OK
RoundRobin<Choice, Choice, Choice> bad_robin;

我希望提供默认构造以下结构的能力(以及注入各自的选择(。

然而,在默认构造之后,choices元组会使用看似悬空的引用进行初始化,任何访问尝试都会导致segfault。

我是否可以默认构造choices元组(并维护引用注入的现有功能(?

感谢

我建议将成员元组更改为不添加引用,并使用CTAD:

template<typename... Ts>
struct RoundRobin
{
RoundRobin() : choices{Ts{}...} {}
// Expected behaviour
RoundRobin(std::in_place_t, Ts&... c) : choices{std::forward_as_tuple(c...)}
{}
std::tuple<Ts...> choices;
};
template <typename... Ts>
RoundRobin(std::in_place_t, Ts&...) -> RoundRobin<Ts&...>;

演示。

最新更新