我正在设计一个行为类似于 C++ 引用但做一些额外的工具(簿记)的类。
最初我认为这std::reference_wrapper<T>
将是一个很好的模型。但过了一会儿,我意识到std::reference_wrapper<T>
即使在原则上,它也不像 C++ 引用那样表现,因为赋值重新绑定了内部指针。
double a = 5.;
double b = 3.;
double& ref = a;
ref = b;
assert(&ref != &b); // ref is not bound to b
std::reference_wrapper<double> refwpr = a;
refwpr = b;
assert(&refwpr.get() == &b); // ref wrapper was rebound to b
我当然可以为我自己的类改变这种行为(而不是重新绑定),但我认为可能已经有一个模拟引用的类。例如像“ std::real_reference<T>
”这样的东西。
是否有更紧密地模拟引用的类(标准或非标准)?
我认为它也很有用,例如在许多地方,人们认为
std::vector<std::reference_wrapper<T>>
它是一种替代方案,std::vector<T&>
但这具有误导性,因为语义不同,但可以通过一些修改来实现std::vector<std::real_reference<T>>
。
我现在认为,如果一个“完美”的引用包装是可能的,那么引用可以只用指针来实现,我们不需要T&
,而只是简单地拥有一个在所有方面都reference<T>
完全一样的库功能T&
......
...这反过来意味着该语言可以允许您“重载”&
类型上的属性以生成自定义类型而不是语言参考。例如using mytype& = custom_reference_emulator_of_mytype
.