gpt4 book ai didi

c++ - 不可复制类型的 std::initializer_list 替代品

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:51 25 4
gpt4 key购买 nike

我知道尝试使用 std::initializer_list<NonCopyable>导致错误,因为元素被复制到由 initializer_list 表示的临时数组中.我还阅读了一些解释,说明为什么在列表中使用右值引用是不对的,我对此很满意。

问题是我想传递不可复制的东西不是为了从它们中移动,而只是想 const -访问它们,因此关于右值的论点不适用。如果可能的话,我该怎么做才能保留列表初始化语法和引用语义(没有包装器,没有原始指针)?

NonCopyable a{...}, b{...};
ListInitialized c{a, b};

我想我在这里遗漏了一些非常明显的东西。

更新:

这行得通(*),

ListInitialized(std::initializer_list<std::reference_wrapper<NonCopyable>>) {...}

但不接受右值。如果我可以简单地传递一个可以进入 const NonCopyable& 的任何列表,那就太好了.

(*) 我知道我写了“无包装器”,但这既不影响调用代码也不影响列表迭代。

最佳答案

你可以给 ListInitialized 一个可变构造函数模板:

struct ListInitialized
{
template <class... T>
ListInitialized(const T... &arg);
};

如果你需要确保它只能用正确的类型实例化,考虑合适的SFINAE :

struct ListInitialized
{
template <
class... T,
class Sfinae = std::enable_if_t<std::is_same<std::decay_t<T>, NonCopyable> &&...
>
ListInitialized(const T... &arg);
};

关于c++ - 不可复制类型的 std::initializer_list 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55452191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com