假设我们有一个嵌入另一个参数的类,它必须支持复制和移动。让我们假设——在某些情况下——需要以某种方式找出内在价值。
一种典型的方法可以是这样的:
template<class T>
class wrapper
{
public:
wrapper() :val() {}
wrapper(T s) :val(std::move(s)) {}
wrapper(const wrapper& s) :val(s.val) {}
wrapper(wrapper&& s) :val(std::move(s.val)) {}
wrapper& operator=(wrapper s) { val = std::move(s.val); return *this; }
T value() const { return val; }
private:
T val;
};
这不是唯一的方法,可能不需要明确复制和移动,但让它们成为。
另一点是:假设T
-in ceratin instances- 本身就是一个复制/可移动类。当然,wrapper::value()
返回 T 的副本。
现在假设返回的 T 必须作为参数进入另一个调用,并且包含的包装器是临时的。
更简单的模拟是
calledfn(wrapper<T>(someT).value());
再说一遍:以这种方式完成是毫无头绪的,但更复杂的情况需要这个微不足道的工作。
从理论上讲,我们可以承认val
从它的临时包装器中移开以将其提供给调用者,但是...什么签名应该具有该value()
方法,以便它在临时时wrapper<T>
被绑定,但在不是临时时不被绑定,为此value() const
应该是首选?