使用Bitfields中的参数构造时,std :: make_shared无法编译

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上交叉检查,并且编译成功.我错过了一些明显的东西吗

打开了连接Bug https://connect.microsoft.com/VisualStudio/feedback/details/804888/with-language-extension-enabled-vc11-an-explicit-cast-is-not-creating-an-rvalue-from位字段

Xeo*_*Xeo 9

这是一个奇怪的.以下代码段在/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的错误报告.