所以我在C ++ 11中发现了这个奇特的东西std::reference_wrapper
,我发现它可能在将来的程序开发中很有用。我玩了一会儿,我认为它可以在某些情况下取代旧的参考以便更好地使用,直到我遇到以下错误:
#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
作为参考的一般改进?
答案 0 :(得分:3)
你的理解是错误的。 std::reference_wrapper
可以隐含地投射到T&amp; (在你的情况下,是testbench)但是当你使用成员访问器(test_a.camper.ownerid
)时,它在camper
上运行,而不是它包装的对象。
您可以进行演员表或使用get
成员函数。这是未经测试的,但我认为它会起作用:
test_a.camper.get().ownerid;