C++ MSVC指针类型属性

C++ MSVC指针类型属性,c++,pointers,visual-c++,C++,Pointers,Visual C++,我最近在使用64位VS2013编译器(更新3)时遇到了一个编译警告(升级为错误),使我意识到存在指针类型属性。 当我正要将“Object*”类型的内容分配给“Object*\uu ptr32”时,该警告表示精度降低 我还没有听说这个“\uu ptr32”后缀,所以我在谷歌上搜索了一下,找到了以下链接:。 读了这篇文章后,我明白了我不应该简单地忽略这个警告,因为我的64位应用程序中可能会出现丑陋的bug 为了进一步查明问题,我编写了以下小程序: #include <type_traits&g

我最近在使用64位VS2013编译器(更新3)时遇到了一个编译警告(升级为错误),使我意识到存在指针类型属性。 当我正要将“Object*”类型的内容分配给“Object*\uu ptr32”时,该警告表示精度降低

我还没有听说这个“\uu ptr32”后缀,所以我在谷歌上搜索了一下,找到了以下链接:。 读了这篇文章后,我明白了我不应该简单地忽略这个警告,因为我的64位应用程序中可能会出现丑陋的bug

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

#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;
}
#包括
结构O{};
结构OD{使用V=O*;};
模板结构expect_equal{static_assert(std::is_same::value,“类型不对应”);};
使用VD=类型名D::V的模板;
模板结构Exp{template using DT=T;};
内部主(空)
{
期待平等;
返回0;
}
虽然它将使用clang进行编译,但我使用我的MSVC 64位编译器(注意:32位编译器没有产生编译错误)得到了以下错误/断言失败:

Microsoft(R)C/C++针对x64优化编译器版本18.00.30723
版权所有(C)微软公司。版权所有。
test.cpp
test.cpp(6):错误C2338:类型不对应。
cpp(13):请参阅对正在编译的类模板实例化“expect_equal”的引用

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

AFAIK you和Charles Petzold是唯一使用这种缩进样式的人(原始示例)…看起来您混合了编译为32位和64位的模块。你能有一个坏的安装,在64位编译器仍然试图使用一个32位的库?我用64位本地编译器Visual C++ 2015来再现这个问题。SergeBallesta:不,这是一个编译器错误,与使用处理
有关。
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