在这个例子中,是否可以避免严格的混叠规则冲突
Is it possible to avoid strict aliasing rule violation in this example?
是否可以在不保留指针的情况下,在不使用任何编译器特定扩展的情况下避免以下示例中的严格混叠警告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();
}
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 此代码是否违反一个定义规则
- 生成文件不对文件使用隐式规则
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 静态结构和一个定义规则
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 链表中写入访问冲突的未知原因
- 尽管遵循了规则,内存泄漏在哪里
- C++中的openCV Mat访问冲突
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 这是关于成员访问规则的正确摘要吗
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 增强精神解析器规则以检测语句中的特殊结尾
- C++尝试深度复制唯一指针时出现内存访问冲突
- 使用“alias()”解析精神规则时访问冲突
- Bison:由于冲突,规则在解析器中无效[-Wother]
- 在这个例子中,是否可以避免严格的混叠规则冲突