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&...>;
演示。