繁体   English   中英

使用emplace_back向向量添加元素时,如何强制编译器使用默认构造函数?

[英]How can I force compiler to use default constructor when adding element to vector using emplace_back?

使用emplace_back向向量添加元素时,如何强制编译器使用默认构造函数?

#include <vector>
#include <utility>

enum E {E1, E2};

struct A
{
  A(){}
  A(int i){}
};

int main()
{
  std::vector<std::pair<E, A>> testMap;

  testMap.emplace_back(E1, 10);
  // testMap.emplace_back(E2);
}

注释掉的行给出以下错误:错误C2664:'std :: pair <_Ty1,_Ty2> :: pair(const std :: pair <_Ty1,_Ty2>&)':无法将参数1从'E'转换为'const std :: pair <_Ty1,_Ty2>&'

接受的答案会调用A的默认构造函数。 但是它也调用A的编译器提供的move构造函数。 如果您只想调用A的默认构造函数,则可以执行以下操作:

testMap.emplace_back(std::piecewise_construct, std::forward_as_tuple(E1),
                                               std::forward_as_tuple());

或这里是一个小的重新拼写:

testMap.emplace_back(std::piecewise_construct, std::forward_as_tuple(E1),
                                               std::tuple<>{});

这些重写公认比以下丑陋得多:

testMap.emplace_back(E1, A{});

但是,如果要保存对A(A&&)的呼叫,这就是方法。

就像您不能仅从E1构造std::pair<E, A>一样,您也不能放置它。 因此,只需提供一个默认构造的A

testMap.emplace_back(E1, A{});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM