使用初始化列表构建时如何避免临时对象创建(和删除)?

时间:2016-03-24 04:08:17

标签: c++ c++11

假设我有两个模板类AB

// Non-modifiable template class.
template<class T>
class A{
private:
    T* ptr;
    int size;
public:
    A( int const inputSize ):
        ptr{ new T[ inputSize ] }, size{ inputSize }
    {}
};

// Modifiable template class.
template<class T>
class B{
private:
    A<T> a_obj;
    int idx;
public:
    B( int const inputSize ):
        a_obj{ A<T>{ inputSize } }, idx{ 0 } //temporary object creation?
    {}
};

B有一个类型为A的成员变量,需要在构造B期间构建。有没有办法在构造A时避免临时构造类型B的对象(如果它发生的话)?另外,请假设我们无法修改A模板类。

我想要了解的是我们在向量中使用emplace_back()push_back()相比较的类似功能:对象是在该位置构建的,而不是两次。

1 个答案:

答案 0 :(得分:3)

您可以(并且应该)直接传递A构造函数参数而不需要隐含临时代码,而不是......

a_obj{ A<T>{ inputSize } }, idx{ 0 } //temporary object creation?

... ...使用

a_obj{ inputSize }, idx{ 0 }

(前者是否实际创建了一个临时性取决于优化者)。