使用 reference_wrappers 初始化向量



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

#include <iostream>
#include <vector>
#include <functional>
using namespace std;
struct Base
{
virtual void print() = 0;
};
struct X1: public Base
{
void print() override
{
cout << "X1n";
}
};
struct X2: public Base
{
void print() override
{
cout << "X2n";
}
};

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

存在具有std::initializer_list的矢量构造函数。传递值的类型必须是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包装器初始化非constBase

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

请改用const Base

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

最新更新