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