2013-11-27 39 views
3

对于下面的示例,是否可以避免严格的别名警告warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing],而不保留指针,而不使用任何编译器特定的扩展名,new返回的位置?在这个例子中是否有可能避免严格的别名违规?

int main() 
{ 
    alignas(::std::string) char a[sizeof(::std::string)]; 

    new (a) ::std::string; 

    auto& s(*reinterpret_cast<::std::string*>(a)); 

    return s.size(); 
} 
+0

那是什么代码???您想做什么 ??? –

+0

@StephaneRolland避免/注意警告。 – user1095108

+0

“保留指针,”新“返回的位置正是如何做到这一点。你为什么不想这样做? –

回答

1

任何你不能这样做的理由?

alignas(::std::string) char a[sizeof(::std::string)]; 

    auto s = new (a) ::std::string; 

    return s->size(); 
+1

是的,'variant'可以包含多种类型,存储指向它们的指针是不切实际的。 – user1095108

+0

@ user1095108:你可以使用union(如果有意义的话)... – Jarod42

2

这似乎做到这一点:

#include <string> 

int main() 
{ 
    alignas(::std::string) char a[sizeof(::std::string)]; 

    new (a) ::std::string; 

    void* const tmp(a); 

    auto& s(*static_cast<::std::string*>(tmp)); 

    return s.size(); 
} 
0

采用这种方法之下没有必要的指针存储多种类型。

int main() 
{ 
    alignas(::std::string) char a[sizeof(::std::string)]; 

    char *p = reinterpret_cast<char *> (new (a) ::std::string); 

    auto& s(*reinterpret_cast<::std::string*>(p)); 

    return s.size(); 
} 
0

经历一个char *临时似乎避免了警告:

int main() 
{ 
    alignas(::std::string) char a[sizeof(::std::string)]; 

    new (a) ::std::string; 

    char* t = a; 
    auto& s(*reinterpret_cast<::std::string*>(t)); 

    return s.size(); 
} 
相关问题