如何将一个类成员留在未构造中,以便以后使用placement new进行构建

FSM*_*axB 3 c++ constructor initialization c++14

我想创建一个模板,其中包含一个应该保持未构造的私有成员,直到使用placement new显式构造它.

如何用C++ 14实现这一目标?

有点像这样:

template <typename T>
class Container {
    private:
        T member; //should be left unconstructed until construct() is called
    public:
        Container() = default;
        void construct() {
            new (&this->member) T();
        }
};
Run Code Online (Sandbox Code Playgroud)

yur*_*hek 5

有一种比Nir更干净的方式,使用类似联合的类:

template <typename T>
class Container {
    private:
        bool is_constructed = false;
        union { T member; };
    public:
        Container() {}
        ~Container() {
            if (is_constructed) {
                member.~T();
            }
        }
        void construct() {
            assert(!is_constructed);
            new (&this->member) T();
            is_constructed = true;
        }
};
Run Code Online (Sandbox Code Playgroud)

您可能还想添加其他构造函数/赋值运算符.当然,在这个简单的情况下std::optional,完全相同的事情,但更清洁.如果你想在其他状态下编码,或者有多个成员由同一个标志管理,你想要避免bool类似的开销,这仍然很有用is_constructed.