2

所以我std::reference_wrapper在 C++11 中发现了这些奇特的东西,我发现它可能对未来的程序开发很有用。我玩了一会儿,我认为它可以在某些情况下替换旧的参考以获得更好的使用,直到我遇到以下错误:

#include <iostream>
#include <functional>

class testbench {
public:
    int ownerid = 5;
    bool camper = false;
};

class testing {
public:
    testing(testbench &x);
    int quack = 3;
    std::reference_wrapper <testbench> camper;
};

testing::testing(testbench &x):camper(x) {
}

int main() {
    testbench tempo;
    testing test_a (tempo);
    std::cout << test_a.camper.ownerid;
}

这会导致 gcc 出错(我使用 Code::Blocks 作为编辑器,使用 gcc 作为编译器)

'class std::reference_wrapper<testbench>' has no member named 'ownerid'

如果线

    std::reference_wrapper <testbench> camper;

改为:

    testbench &camper;

然后一切都按我的预期进行。

我该如何解决这个问题,或者这只是我 std::reference_wrapper作为参考的一般改进的误解?

4

1 回答 1

4

你的理解是错误的。 std::reference_wrapper可以隐式转换为 T& (在您的情况下为 testbench),但是当您使用成员访问器 ( test_a.camper.ownerid) 时,它在camper, 而不是它所包装的对象上运行。

您可以进行强制转换或使用get成员函数。这是未经测试的,但我认为它会起作用:

test_a.camper.get().ownerid;
于 2018-02-27T03:37:01.113 回答