C++11 emplace_back是否在新位置构造对象而不是使用移动?

C++11 emplace_back是否在新位置构造对象而不是使用移动?,c++11,C++11,从链接it状态 例如,在我们开始的代码中,my_vec.push_back(“foo”) 从字符串文本构造一个临时字符串,然后移动 将字符串插入容器中,而我的向量放回(“foo”) 只需直接在容器中构造字符串,避免 额外的动作。对于更昂贵的类型,这可能是使用 尽管可读性和 安全成本,但也可能不会。很多时候,表演 不同并不重要 所以我决定试试,这就是我所做的 class foo { public: int counter; foo() { std::

从链接it状态

例如,在我们开始的代码中,my_vec.push_back(“foo”) 从字符串文本构造一个临时字符串,然后移动 将字符串插入容器中,而我的向量放回(“foo”) 只需直接在容器中构造字符串,避免 额外的动作。对于更昂贵的类型,这可能是使用 尽管可读性和 安全成本,但也可能不会。很多时候,表演 不同并不重要

所以我决定试试,这就是我所做的

class foo
{
    public:
    int counter;
    foo()
    {
        std::cout << "Regular constructor\n";
    }
    foo(const foo& f)
    {
        std::cout << "Copy constructor\n";
    }
    foo(foo&& f)
    {
        std::cout << "Move constructor\n";
    }
};

int main()
{
   std::vector<foo> f;
   f.push_back(foo()); //Regular constructor and Move Constructor
   f.emplace_back(foo()); //Regular constructor and Move Constructor
}
class-foo
{
公众:
整数计数器;
foo()
{
std::cout
vector::emplace_back(Args&&…
获取您要用来构造新对象的构造函数的参数。在您引用的示例中,这是构造函数
string::string(const char*)的
const char*
。在您自己的代码中,您通过传递一个临时对象来强制移动构造函数。若要在原地默认构造对象,请使用
f.emplace\u back()
,不带任何参数,因为默认构造函数不带任何参数

另外,为了避免重新分配(可能更多的移动会破坏您的测试),请首先使用
f.reserve(2)
确保向量有空间放置两个测试对象

完整代码:

class foo
{
public:
    foo()
    {
        std::cout << "Default constructor\n";
    }
    foo(const foo& f)
    {
        std::cout << "Copy constructor\n";
    }
    foo(foo&& f)
    {
        std::cout << "Move constructor\n";
    }
};

int main()
{
   std::vector<foo> f;
   f.reserve(2);
   f.push_back(foo());
   f.emplace_back();
}

谢谢你的澄清。我不知道emplace_back允许默认构造
Default constructor
Move constructor
Default constructor