- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
环境:Microsoft Visual Studio 2010 with SP1 Preminum(10.0.40219.1 SP1Rel), Windows XP SP3
VC10 编译器支持 auto 关键字,但推导的类型相关信息对于枚举似乎并不总是正确的。
例子:
#include <type_traits>
enum fruit_t
{
apple = 100,
banana = 200,
};
int main()
{
const auto pa = new auto(banana);
const auto pb = new fruit_t(banana);
static_assert(std::is_same<decltype(pa), decltype(pb)>::value, "not same!");
delete pb;
delete pa;
}
上面的代码应该没有编译时错误或运行时错误。但令我惊讶的是,它编译正常,没有任何错误或警告,但运行不正确。调试器在退出主函数后告诉:
检测到堆损坏:在 0x00034878 处的 %hs block (#55) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存。
所以我猜测编译器可能在“自动”类型推导方面存在错误。下面的汇编程序窗口显示,在第一个“operator new”调用中请求的内存大小为 1 个字节,而第二个“operator new”调用为 4 个字节。这表明编译器在推导类型的大小上犯了一个大错误。
您认为这是编译器错误吗? Microsoft 是否修复了任何错误?
int main()
{
004113C0 push ebp
004113C1 mov ebp,esp
004113C3 sub esp,10Ch
004113C9 push ebx
004113CA push esi
004113CB push edi
004113CC lea edi,[ebp-10Ch]
004113D2 mov ecx,43h
004113D7 mov eax,0CCCCCCCCh
004113DC rep stos dword ptr es:[edi]
const auto pa = new auto(banana);
004113DE push 1
004113E0 call operator new (411181h)
004113E5 add esp,4
004113E8 mov dword ptr [ebp-104h],eax
004113EE cmp dword ptr [ebp-104h],0
004113F5 je main+51h (411411h)
004113F7 mov eax,dword ptr [ebp-104h]
004113FD mov dword ptr [eax],0C8h
00411403 mov ecx,dword ptr [ebp-104h]
00411409 mov dword ptr [ebp-10Ch],ecx
0041140F jmp main+5Bh (41141Bh)
00411411 mov dword ptr [ebp-10Ch],0
0041141B mov edx,dword ptr [ebp-10Ch]
00411421 mov dword ptr [pa],edx
const auto pb = new fruit_t(banana);
00411424 push 4
00411426 call operator new (411181h)
0041142B add esp,4
0041142E mov dword ptr [ebp-0F8h],eax
00411434 cmp dword ptr [ebp-0F8h],0
0041143B je main+97h (411457h)
0041143D mov eax,dword ptr [ebp-0F8h]
00411443 mov dword ptr [eax],0C8h
00411449 mov ecx,dword ptr [ebp-0F8h]
0041144F mov dword ptr [ebp-10Ch],ecx
00411455 jmp main+0A1h (411461h)
00411457 mov dword ptr [ebp-10Ch],0
00411461 mov edx,dword ptr [ebp-10Ch]
00411467 mov dword ptr [pb],edx
static_assert(std::is_same<decltype(pa), decltype(pb)>::value, "not same!");
delete pb;
0041146A mov eax,dword ptr [pb]
0041146D mov dword ptr [ebp-0ECh],eax
00411473 mov ecx,dword ptr [ebp-0ECh]
00411479 push ecx
0041147A call operator delete (411087h)
0041147F add esp,4
delete pa;
00411482 mov eax,dword ptr [pa]
00411485 mov dword ptr [ebp-0E0h],eax
0041148B mov ecx,dword ptr [ebp-0E0h]
00411491 push ecx
00411492 call operator delete (411087h)
00411497 add esp,4
}
最佳答案
是的,我认为这是一个 VS2010 错误。使用 XP SP3(32 位)和 VS2010 SP1 运行与您相同(或至少非常相似),我得到完全相同的错误。它看起来特定于枚举,因为在类中尝试显示一切正常。我还尝试将另一个水果项目添加到枚举中,其值为 100000,只是为了确保它不像您的枚举那样愚蠢,所有值都低于 255。结果相同。
我在 Microsoft Connect 上进行了快速搜索,而且我没有看到关于此的错误报告,因此我建议您输入一个。这是确保 Microsoft 知道并可能修复它的最佳方法。
关于c++ - 这是 "new auto(enum_type)"的 Microsoft VC++ 2010 编译器错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260638/
这个问题在这里已经有了答案: Range based loop: get item by value or reference to const? (5 个答案) 关闭 6 年前。 如果我有这样的类
最近,我使用 CSS grid 创建了一个布局.虽然这很好用,但我对它的工作原理感到困惑。具体来说,我对 grid-template-rows: auto auto 1fr auto; 这一行感到困惑
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't margin-top: auto and margin-bottom:auto work
我几乎已经尝试了所有我知道的方法,但是当我将我的 Android studio 更新到最新版本时,它仍然显示此错误。我该怎么办? gradle.build 是: buildscript { r
我想创建一个deep_flatten函数模板,该模板将生成包含range ed的元素的join。例如,如果仅考虑嵌套的std::vector,我可以拥有: template struct is_ve
我刚刚看了 Scott Meyers Universal References in C++11有一件事我不太明白。 我对作为“通用引用”的 auto 之间的区别感到有点困惑,即 auto&& 和常规
这个问题在这里已经有了答案: C++11 Range-based for-loop efficiency "const auto &i" versus "auto i" (3 个答案) 关闭 3 年
由于 auto 关键字在编译时获取类类型,我想知道使用 auto* 是否有任何效率,或者是否有任何特殊用途该表达式,因为 auto 在编译时已经获得了指针类型。 最佳答案 这个“新奇的 C++11”与
请问我是否正确,对函数返回值使用 auto&& 总是比使用 auto 更好。例如,在 auto val = someObj.getVal(); 如果 getVal() 返回引用,则 val 将是一个拷
有区别吗: template constexpr decltype(auto) f(T&& x) -> decltype(std::get(std::forward(x))) { retur
我想创建一个 deep_flatten会产生 range 的函数模板深的元素join编。例如,如果我们只考虑嵌套 std::vector s,我可以有: template struct is_vec
我在玩auto在 std::pair .在下面的代码中,函数 f应该返回 std::pair依赖于模板参数的类型。 一个工作示例: 示例 1 template auto f() { if c
我是一名 Android 开发人员,我正在尝试开发一个定制的 Android Auto 应用程序,它可以简单地镜像手机屏幕。 我知道目前 API 仅适用于音乐和消息应用程序,但我会编写一个应用程序来镜
我有一个很大的 div,里面有文字: #big-div { height: 400px; overflow: auto; } 如何才能使当新内容添加到 div(并发生溢出)时,div
我正在尝试设计一个网站,其中包含一个带有溢出的内容区域:自动和一个动态高度。最好是,我希望能够在 overflow: auto div 下方放置一个页眉和一个页脚,并让该 div 占用剩余的空间,但到
这个问题在这里已经有了答案: Does 'auto' type assignments of a pointer in c++11 require '*'? (3 个答案) 关闭 6 年前。 以下在
当使用 auto&& 处理返回左值的函数时: int func() { int v=42; return v; } auto && v = func(); 将 v 视为引用而不是左值会产生
我读了一篇关于 auto 类型推导的文章,使用 decltype 我想知道我在下面的例子中关于如何推导类型的逻辑是否正确(所以如果我是有误请指正:) #include using namespace
这个问题在这里已经有了答案: What's the semantically accurate position for the ampersand in C++ references (3 个回答)
假设我有 class Container { public: T getValue() const { return t; } const T& getCRef() const {
我是一名优秀的程序员,十分优秀!