为什么我可以直接调用构造函数,但是当我在 emplace_back 中使用完全相同的参数时,却收到错误“没有匹配的成员函数用于调用'emplace_back'”?为了得到错误,我需要将一个列表传递给构造函数。这里肯定发生了一些非常简单的事情,但我在搜索中找不到它。
这是一个最小的例子。
class A {
public:
A(std::list<double> c){
}
};
void test(){
A an_A = A({0.0}); //No error
std::list<A> list_of_As;
list_of_As.emplace_back({0.0}); //Error
}
最佳答案
{}
的问题在于它可以描述多种类型。现在,当您不指定类型时,编译器需要推断您要发送的输入类型,但它无法做到这一点。因此,您必须指定 {}
的类型。
void test(){
A an_A = A({0.0});
std::list<A> list_of_As;
list_of_As.emplace_back(list<double>{0.0});
}
其他选项:
下一个类:
class A {
public:
A(list<double> c, int a){
}
};
您可以使用:
list_of_As.emplace_back(list<double>{0.0}, 1);
//list_of_As.emplace_back(A({0.0}, 1)); <-- Avoid using this. Explanation is right after this section.
list_of_As.emplace_back(initializer_list<double>{0.0}, 1);
安放与推送
is there any good reason not to solve the problem with A({0.0}) rather than list{0.0} ?
是的。 emplace_back
用于就地创建列表的对象,而不是稍后将它们复制/移动到列表中。没有理由像 push_back
那样使用 emplace_back
。使用 emplace_back
的正确方法是向其发送对象构造函数的参数,而不是对象本身。
push_back
会将您的对象移动到列表/vector 中,前提是它通过引用(右值)移动并且元素类型具有移动赋值运算符。
关于c++ - 为什么即使直接构造函数有效, emplace_back 也会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51443319/