【问题标题】:Initializing vector with reference_wrappers使用 reference_wrappers 初始化向量
【发布时间】:2020-01-05 14:04:54
【问题描述】:

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

#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 的向量构造函数。传入的值的类型必须是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 构建)

【问题讨论】:

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


    【解决方案1】:

    您正在使用const 包装器初始化非const Base

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

    改用const Base

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

    【讨论】:

    • 尝试const Base 用于模板参数以及Basestd::ref(而不是std::cref)无济于事。
    • @Student4K 将const Basestd::crefBasestd::ref 一起使用。两者都为我工作:wandbox.org/permlink/DxpPdk3q1WDSB6uy。请注意,const Base 甚至可以与 std::ref 一起使用。
    • 嗯...看起来只有 gcc 9.x 编译代码,而 7.x 和 8.x 没有。
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2021-07-08
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多