对于下面的例子,有没有可能避免严格的别名警告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();
}发布于 2013-11-27 20:26:33
这似乎可以做到这一点:
#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();
}发布于 2013-11-27 20:25:22
你有什么理由不能这么做吗?
alignas(::std::string) char a[sizeof(::std::string)];
auto s = new (a) ::std::string;
return s->size();发布于 2013-11-27 21:53:34
使用下面的方法,不需要存储指向多个类型的指针。
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();
}https://stackoverflow.com/questions/20242297
复制相似问题