在此示例中是否可以避免严格的别名规则违规?

时间:2013-11-27 12:17:15

标签: c++ c++11

是否可以避免以下示例的严格别名警告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();
}

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

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

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

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

  return s->size();

答案 2 :(得分: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();
}

答案 3 :(得分: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();
}