C++ 在使用emplace\u back向向量添加元素时,如何强制编译器使用默认构造函数?
在使用emplace\u back向向量添加元素时,如何强制编译器使用默认构造函数C++ 在使用emplace\u back向向量添加元素时,如何强制编译器使用默认构造函数?,c++,c++11,C++,C++11,在使用emplace\u 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); // t
#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);
}
#包括
#包括
枚举E{E1,E2};
结构A
{
A(){}
A(int i){}
};
int main()
{
向量测试图;
测试图。向后安放(E1,10);
//测试图。安置在后方(E2);
}
注释掉的行给出了以下错误:
错误C2664:“std::pair::pair(const std::pair&”):无法将参数1从“E”转换为“const std::pair&”就像不能从
E1
构造std::pair
一样,也不能放置它。因此,只需提供一个默认的a
:
testMap.emplace_back(E1, A{});
就像不能从
E1
构造std::pair
一样,也不能放置它。因此,只需提供一个默认的a
:
testMap.emplace_back(E1, A{});
接受的答案确实调用了
的默认构造函数。但它也调用编译器提供的move构造函数。如果只想调用
的默认构造函数,可以执行以下操作:
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<>{});
但是,如果您想保存对a(a&&)
的调用,这就是方法。接受的答案确实调用a
的默认构造函数。但它也调用编译器提供的move构造函数。如果只想调用
的默认构造函数,可以执行以下操作:
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<>{});
但是,如果您想保存对a(a&&)
的调用,那么这就是方法