c++ - 使用 reference_wrappers 初始化 vector

标签 c++ vector initializer-list reference-wrapper

我正在尝试使用引用包装器的 vector 运行示例,但在 vector 变量声明时遇到编译错误。这是代码:

#include <iostream>
#include <vector>
#include <functional>

using namespace std;

struct Base
{
    virtual void print() = 0;
};

struct X1: public Base
{
    void print() override
    {
        cout << "X1\n";
    }
};

struct X2: public Base
{
    void print() override
    {
        cout << "X2\n";
    }
};


int main()
{
    X1 x1;
    X2 x2;
    vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};
}

具有std::initializer_list 的 vector 构造函数存在。传递值的类型必须是 const Tstd::cref 返回,所以它为什么会报错:

/home/u1/sandbox/c++/trash/untitled/main.cpp:33: error: no matching function for call to ‘std::vector<std::reference_wrapper<Base> >::vector(<brace-enclosed initializer list>)’
     vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};
                                                         ^

? (如果重要,使用 gcc -std=c++17 构建)

最佳答案

你正在用 const 包装器初始化一个非 const Base:

vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};

改用 const Base:

vector<reference_wrapper<const Base>> X{cref(x1), cref(x2)};

关于c++ - 使用 reference_wrappers 初始化 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758566/

相关文章:

c++ - 返回 0 隐式

c++ - 内联构造函数可以在 C++ 中使用初始化列表吗?

c++ - 重载 >> 运算符并使用自定义类型的初始化列表进行初始化

c++ - 二维 vector 声明之间的区别

python - Doc2vec:如何手动修改 Doc2Vec gensim 模型中的训练向量?

c++ - 指向包含 vector<int> 问题的实例类的指针

c++ - 为什么在 VS2019 中 std::initializer_list 的初始化似乎失败了

c++ - 并行计算的 C++ 代码优化示例

c++ - 在 Windows 中将文件所有者设置为不存在的用户/SID

C++ - 为模板类专门化成员函数