初始化参考列表的替代方案

时间:2017-03-29 23:41:45

标签: c++

我真的需要和初始化参考列表,但似乎不可能。复制的问题是我想要禁用复制构造,因为这些副本会在之后调用destrutor释放资源(并且不应该发生)。

我目前的(不好)替代方案是使用bool来跟踪它是否是复制构造的,因此资源不会被释放。

另一个替代方案是指针的初始化列表但是这使得它更加冗长,并且在我看来会接受nullptr以及在概念上不正确。

我真的很喜欢使用引用或其他类似的替代品(可能会移动?我似乎无法做到这一点)

1 个答案:

答案 0 :(得分:1)

我假设您需要一个初始化列表,其中包含放入容器的引用引用。所以,你正在寻找一种参考类型,对吧?如果是这样,请检查参考包装。它允许引用作为容器的类型:

#include <iostream>
#include <functional>

struct A {
    A() { std::cout << "A()" << std::endl; }
    A(const A&) = delete;
    ~A() { std::cout << "~A()" << std::endl; }
};

int main(int argc, char const *argv[])
{
    A a1;
    A a2;
    A a3;

    {
        // OK: don't call copy constructor during creation
        std::initializer_list<std::reference_wrapper<A>> ilist{ a1, a2, a3 };
        // OK: don't call destructor when "ilist" leaves the scope
    }

    {
        // ERROR: can't create the list because copy constructor is deleted
        std::initializer_list<A> va{ a1, a2, a3 };
    }


    // Destructors called here

    return 0;
}