使用reference_wrappers初始化向量

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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

向量构造函数std::initializer_list存在。传递值的类型必须是const T,它std::cref会返回,那么为什么它会抱怨:

\n\n
/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                                                         ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Pau*_*ans 5

您正在初始化一个非const Baseconst包装器:

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)

  • @Student4K 将 `const Base` 与 `std::cref` 一起使用,或者将 `Base` 与 `std::ref` 一起使用。两者都适合我:https://wandbox.org/permlink/DxpPdk3q1WDSB6uy。请注意,“const Base”甚至可以与“std::ref”一起使用。 (2认同)