【发布时间】:2010-07-02 16:29:14
【问题描述】:
我有一个函数address_of,它返回一个Pointer(封装一个shared_ptr)到它的参数。 address_of 需要同时处理左值和右值,因此address_of 有两个版本:一个接受引用,另一个接受右值引用。由于获取临时地址是一个坏事™,address_of 的右值版本需要执行移动构造,以便Pointer 实际拥有某些东西。实现很简单:
template<class T>
inline Pointer address_of(T& value) {
return Pointer(&value);
}
template<class T>
inline Pointer address_of(T&& value) {
return Pointer(new T(std::move(value)));
}
并按预期获取临时作品的地址:
Pointer p = address_of(Derived());
但是当我使用以下代码进行测试时:
Base* object = new Derived();
Pointer p = address_of(*object);
GCC 抱怨对 address_of 的调用不明确:
error: call of overloaded ‘address_of(Base&)’ is ambiguous
note: candidates are: Pointer address_of(T&) [with T = Base]
note: Pointer address_of(T&&) [with T = Base&]
我的印象是一元 * 总是返回一个左值,在这种情况下甚至不应该考虑右值版本。这里到底发生了什么?
【问题讨论】:
标签: c++ c++11 rvalue-reference