2

我正在设计一个行为类似于 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.

4

1 回答 1

2
template <typename T>
class Tref {
    std::tuple<T &> t;
public:
    template <typename... Args>
    Tref(Args&&... args): t(std::forward<Args>(args)...) {}
    operator T &() { return std::get<0>(t); }
    decltype(&std::get<0>(t)) operator&() { return &std::get<0>(t); }
};


Tref<double &> t(a);
t = b;
assert(&t != &b);

std::reference_wrapper当模板删除引用时,绑定是什么。您无需构建一个类来满足您的需求,只需使用普通参考即可。(我可能描述不清楚。我的英语很差。)

于 2015-12-12T14:58:20.453 回答