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