首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在本例中,是否有可能避免严格的别名规则冲突?

在本例中,是否有可能避免严格的别名规则冲突?
EN

Stack Overflow用户
提问于 2013-11-27 20:17:15
回答 4查看 336关注 0票数 3

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

代码语言:javascript
复制
int main()
{
  alignas(::std::string) char a[sizeof(::std::string)];

  new (a) ::std::string;

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

  return s.size();
}
EN

回答 4

Stack Overflow用户

发布于 2013-11-27 20:26:33

这似乎可以做到这一点:

代码语言:javascript
复制
#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();
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-27 20:25:22

你有什么理由不能这么做吗?

代码语言:javascript
复制
  alignas(::std::string) char a[sizeof(::std::string)];

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

  return s->size();
票数 1
EN

Stack Overflow用户

发布于 2013-11-27 21:53:34

使用下面的方法,不需要存储指向多个类型的指针。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20242297

复制
相关文章

相似问题

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