Stu*_*t4K 0 c++ vector initializer-list reference-wrapper
我正在尝试使用引用包装器向量运行一个示例,但在向量变量声明处遇到编译错误。这是代码:
\n\n#include <iostream>\n#include <vector>\n#include <functional>\n\nusing namespace std;\n\nstruct Base\n{\n virtual void print() = 0;\n};\n\nstruct X1: public Base\n{\n void print() override\n {\n cout << "X1\\n";\n }\n};\n\nstruct X2: public Base\n{\n void print() override\n {\n cout << "X2\\n";\n }\n};\n\n\nint main()\n{\n X1 x1;\n X2 x2;\n vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};\n}\nRun Code Online (Sandbox Code Playgroud)\n\n向量构造函数std::initializer_list存在。传递值的类型必须是const T,它std::cref会返回,那么为什么它会抱怨:
/home/u1/sandbox/c++/trash/untitled/main.cpp:33: error: no matching function for call to \xe2\x80\x98std::vector<std::reference_wrapper<Base> >::vector(<brace-enclosed initializer list>)\xe2\x80\x99\n vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};\n ^\nRun Code Online (Sandbox Code Playgroud)\n\n?\n(如果重要的话,使用 gcc -std=c++17 构建)
\n您正在初始化一个非const Base带const包装器:
vector<reference_wrapper<Base>> X{cref(x1), cref(x2)};
Run Code Online (Sandbox Code Playgroud)
使用const Base:
vector<reference_wrapper<const Base>> X{cref(x1), cref(x2)};
Run Code Online (Sandbox Code Playgroud)