Abh*_*jit 2 c++ visual-c++ c++11
请考虑以下最小的可重新创建的标准兼容代码
#include <vector>
#include <memory>
struct Foo
{
int m_field1;
Foo(int field1):m_field1(field1){};
};
typedef unsigned long DWORD;
typedef unsigned short WORD;
struct BitField {
struct {
DWORD Field1:31;
DWORD Field2:1;
} DUMMY;
};
int main()
{
std::vector<std::shared_ptr<Foo>> bar;
BitField *p = new BitField();
//This Line compiles
auto sp1 = std::shared_ptr<Foo>(new Foo((DWORD)p->DUMMY.Field1));
//But std::make_shared fails to compile
auto sp2 = std::make_shared<Foo>((DWORD)p->DUMMY.Field1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码无法在VC11 Update 2中编译,并显示以下错误消息
1>Source.cpp(23): error C2664: 'std::shared_ptr<_Ty> std::make_shared<Foo,DWORD&>(_V0_t)' : cannot convert parameter 1 from 'DWORD' to 'unsigned long &'
1> with
1> [
1> _Ty=Foo,
1> _V0_t=DWORD &
1> ]
Run Code Online (Sandbox Code Playgroud)
我在IDEONE上交叉检查,并且编译成功.我错过了一些明显的东西吗
这是一个奇怪的.以下代码段在/Za
(禁用语言扩展)编译器标志下编译,但不是没有:
struct {
unsigned field:1;
} dummy = {0};
template<class T>
void foo(T&&){}
int main(){
foo((unsigned)dummy.field);
}
Run Code Online (Sandbox Code Playgroud)
错误没有/Za
:
错误C2664:'foo':无法将参数1从'unsigned int'转换为'unsigned int&'
这显然是一个错误,因为转换unsigned
应该只是创建一个rvalue,不应该推导为左值引用,不应该将其视为位字段.我有一种感觉"rvalues绑定到左值参考"的扩展在这里起作用.
请提交有关Microsoft Connect的错误报告.