MSVC指针类型属性

时间:2015-08-11 06:08:00

标签: c++ pointers visual-c++

我最近使用64位VS2013编译器(更新3)遇到了编译警告(提升为错误),让我意识到指针类型属性的存在。 警告表示精确度下降,因为我要将“Object *”类型分配给“Object * __ptr32”。

我还没有听说过这个'__ptr32'后缀,所以我做了一些谷歌搜索,发现了以下链接:http://blog.aaronballman.com/2013/05/msvc-pointer-type-attributes/。 阅读本文之后,很明显我不应该简单地忽略这个警告,因为我的64位应用程序中可能会出现丑陋的错误......

为了进一步查明问题,我写了以下小程序:

#include <type_traits>

struct O { };
struct OD { using V = O *; };

template <typename X, typename Y> struct expect_equal { static_assert(std::is_same<X, Y>::value, "Types do not correspond."); };

template <class D> using VD = typename D::V;
template <class D> struct Exp { template <template <class> class T> using DT = T<D>; };

int main(void)
{
   expect_equal<Exp<OD>::DT<VD>, O *> e;
   return 0;
}

虽然它会使用clang进行编译,但是使用我的MSVC 64位编译器时出现以下错误/断言失败(注意:32位编译器没有产生编译错误):

Microsoft (R) C/C++ Optimizing Compiler Version 18.00.30723 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
test.cpp(6) : error C2338: Types do not correspond.
test.cpp(13) : see reference to class template instantiation 'expect_equal<O * __ptr32,O *>' being compiled

我想知道是否有人可以在这里指出我做错了什么:我没有在任何地方使用显式指针类型属性。这也可能是一个未指定的行为或STL实现或编译器的错误,但很可能我在这里错过了一些重要的点...提前致谢!

0 个答案:

没有答案