gpt4 book ai didi

c++ - std::make_shared 在使用来自位域的参数构造时无法编译

转载 作者:太空狗 更新时间:2023-10-29 23:30:30 25 4
gpt4 key购买 nike

考虑以下最小的可重新创建的标准兼容代码

#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;
}

此代码无法在 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> ]

我交叉检查了 IDEONE ,编译成功。我是否遗漏了一些明显的东西?

连接错误被打开https://connect.microsoft.com/VisualStudio/feedback/details/804888/with-language-extension-enabled-vc11-an-explicit-cast-is-not-creating-an-rvalue-from-bit-fields

最佳答案

这很奇怪。以下代码段在 /Za(禁用语言扩展)编译器标志下编译,但并非没有:

struct {
unsigned field:1;
} dummy = {0};

template<class T>
void foo(T&&){}

int main(){
foo((unsigned)dummy.field);
}

没有 /Za 的错误:

error C2664: 'foo' : cannot convert parameter 1 from 'unsigned int' to 'unsigned int &'

这显然是一个错误,因为转换为 unsigned 应该只是创建一个右值,不应将其推导为左值引用,也不应将其视为位域。我感觉“右值绑定(bind)到左值引用”的扩展在这里发挥了作用。

请在 Microsoft Connect 上提交错误报告。

关于c++ - std::make_shared 在使用来自位域的参数构造时无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19256322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com