【问题标题】:can vector contain a smart pointer which overload operator &?向量可以包含一个重载运算符&的智能指针吗?
【发布时间】:2013-08-30 09:24:07
【问题描述】:

比如我有这样一个智能指针:

template <typename T>
class SmartPointer
{
public:
    ....
    T* operator & () { return m_p; } 
private:
    T* m_p;  
}

void foo()
{
    std::vector<SmartPointer<int> >vec;
    vec.push_back(....);
    vec.resize(.....);
    ......
}

这种用法安全吗?我在 MINGW4.4 中尝试过,它工作正常....

其实那些代码是用来做COM的,当我想得到一个对象时,我需要做这些

SmpartPointer<COMObj> spObj;
HRESULT hr = xxxxx->QueryInterface(&spObj);

然后我想将指针存储在向量中,所以

std::vector<SmpartPointer<COMObj> >vec;
.....    

【问题讨论】:

  • 我不明白为什么它不应该是安全的? vector 是模板化的,因此您所做的任何事情都将基于模板,应该和其他任何事情一样安全。
  • 你为什么要这样做?如果p 是一个普通指针,您不会期望&amp;p 返回该指针。为重载的运算符提供不同的语义是稍后导致错误的好方法。
  • 如果std::vector的实现在内部需要一个指向其数据的原始指针,我希望它使用std::addressofallocator::address来获取它。
  • 我不记得 std::vector 的客户端类 not 重载运算符的任何要求,所以我认为这很好。不过,您对运算符重载的使用是一个坏主意的原型。
  • 你可能想使用'operator T*()'

标签: c++


【解决方案1】:

在 C++03 中,没有明确要求容器中的值类型不重载一元 operator&amp;;然而,每 23.1p3 存储的对象需要建模 CopyConstructible(20.1.3p1,表 30)。这反过来要求表达式&amp;t 应该产生一个T * 类型的值,它表示t 的地址。所以重载一元 operator&amp; 是允许的,但前提是它具有“正确”的返回类型并返回正确的值。

您的operator&amp; 无效;它应该返回SmartPointer&lt;T&gt; *

在 C++11 中,这被放宽了(通过使用 std::addressof),所以一元 operator&amp; 可以有任何类型并返回任何值。

在所有版本的标准中,complexvalarray的类型参数不能重载一元operator&amp;;这是为了让它们被视为连续存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多