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

标签 c++ c++11 list-initialization

我知道尝试使用 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/

相关文章:

c++ - 如何使用自动添加的 Qt 元素

c++ - 在哪里可以找到对 C++ 有状态虚拟基的很好的解释?

c++11 - 从包含其他字符的字符串中提取尾随 int

c++ - 嵌套列表初始化与将 initializer_list 作为第二个参数的构造函数不匹配

c++ - 有关Char字符串和指针的C++问题

python - 我已经安装了 OpenCV C++。我可以在不重新安装库的情况下在 Python 中使用它的功能吗?

c++11 - 类成员初始化的首选方式?

c++ - Eclipse 显示错误,但项目编译并执行

c++ - 使用 Boost assign 初始化具有变量值的类 JSON 映射

c++ - 标准是否防止在可变参数模板中缩小具有足够小的文字值的文字转换