在这个例子中,是否可以避免严格的混叠规则冲突

Is it possible to avoid strict aliasing rule violation in this example?

本文关键字:冲突 规则 可以避免 是否      更新时间:2023-10-16

是否可以在不保留指针的情况下,在不使用任何编译器特定扩展的情况下避免以下示例中的严格混叠警告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();
}

这似乎做到了:

#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();
}

有什么原因不能这样做吗?

  alignas(::std::string) char a[sizeof(::std::string)];
  auto s = new (a) ::std::string;
  return s->size();

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

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();
}

通过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();
}