首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的C++严格别名警告

奇怪的C++严格别名警告
EN

Stack Overflow用户
提问于 2011-11-20 04:21:47
回答 2查看 448关注 0票数 3

下面是我的一个unique_pointer-like类实现代码的精简版本,它仍然存在这个问题:

代码语言:javascript
复制
#include <tr1/type_traits>

template<typename T>
class rv : public T {
  rv();
  ~rv();
  rv( rv const& );
  rv& operator=( rv const& );
};

template<typename T,typename D,bool = std::tr1::is_empty<D>::value>
struct pjl_ptr_storage {
};

template<typename T,typename D>
struct pjl_ptr_storage<T,D,true> : private D {
  T *ptr_;

  pjl_ptr_storage( T *p ) : ptr_( p ) { }
  pjl_ptr_storage( T *p, D &d ) : D( d ), ptr_( p ) { }

  D& deleter() { return *this; }
};

template<typename T>
struct default_delete {
};

template<typename T,class D = default_delete<T> >
class pjl_ptr {
public:
  explicit pjl_ptr( T *p = 0 ) : storage_( p ) { }
  pjl_ptr( rv<pjl_ptr> &p ) : storage_( p.release(), p.storage_.deleter() ) { }

  T* release() {
    T *temp = storage_.ptr_;
    storage_.ptr_ = 0; // dereferencing pointer ‘<anonymous>’ breaks strict-aliasing rules
    return temp;
  }

  operator rv<pjl_ptr>&() {
    return *static_cast<rv<pjl_ptr>*>( this );
  }

private:
  pjl_ptr_storage<T,D> storage_;

  pjl_ptr( pjl_ptr& ); // forbid
};

///////////////////////////////////////////////////////////////////////////////

typedef pjl_ptr<int> int_ptr;

int_ptr f() {
  return int_ptr( 0 ); // this line triggers the warning above
}

int main() {
}

使用用-O2 -fstrict-aliasing -Wstrict-aliasing编译的g++ 4.4.3,我在上面标记的那一行上得到:dereferencing pointer <anonymous> breaks strict-aliasing rules。这恰好是在Ubuntu 64位系统上。如果我在上使用g++ 4.6.1编译相同的代码,我没有得到任何警告。

我大体上理解严格别名规则(或者我是这么认为的),但我不明白为什么它会抱怨有问题的行。

g++ 4.4.3是错误的吗?假设它是正确的,我如何调整代码以摆脱警告,即不违反严格别名规则?

EN

回答 2

Stack Overflow用户

发布于 2011-11-20 06:14:24

gcc不喜欢你强制转换this (你可以试着用0替换this,看看警告是否会消失;我想会的)。因此,您有两个指向同一内存的指针,但类型不同(pjl_ptrrv<pjl_ptr>)。gcc警告您,(例如,由于某些优化)通过rv<pjl_ptr>指针所做的更改(例如,对storage_.ptr_的赋值)可能会通过pjl_ptr指针变得不可见。

就我个人而言,我不明白这怎么会导致你的情况出现问题,但看起来gcc是正确的。

PS。我不是一个标准的大师,所以我不知道标准到底是怎么想的:)

票数 0
EN

Stack Overflow用户

发布于 2011-12-13 16:24:28

我不知道你想做什么。

代码语言:javascript
复制
template<typename T>
class rv : public T {
// private: by default
  rv();
  ~rv();
  rv( rv const& );
  rv& operator=( rv const& );
};

没有可访问的ctor,也没有朋友。您不可能拥有该类的实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8196997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档