c++ - 为什么即使直接构造函数有效, emplace_back 也会失败?

标签 c++

为什么我可以直接调用构造函数,但是当我在 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 中,前提是它通过引用(右值)移动并且元素类型具有移动赋值运算符。

For more reading about move/copy and push_back/emplace_back

关于c++ - 为什么即使直接构造函数有效, emplace_back 也会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51443319/

相关文章:

c++ - Qt 调试:如何知道 QCoreApplication::notifyInternal2 向哪个对象发送消息?

c++ - 如何按姓氏排序并打印新数组?

c++ - directx 相机位置让我感到困惑

c++ - 在 matlab 中创建类或在 matlab 中转换 c 代码

c++ - std::condition_variable_any 的 libc++ 实现

c++ - SFINAE 在创建 "is_iterable"特征时出现问题 - 这是 gcc 错误吗?

c++ - SFML - 无法以正确的方向发射弹丸

c++ - 线性优化目标函数中的绝对值

c++ - 如何执行快速用户切换

c++ - "if if"与 "if else if"的性能差异