为何VC++14.29(C++/CLI)中vector.push_back(System::Byte)无法编译
错误根因说明
该报错和C20标准变更没有关联,是Visual Studio 16.10对应14.29版本的C/CLI编译器收紧了托管对象的引用绑定规则导致的合规性报错,具体逻辑如下:
cli::array<System::Byte>^是存放在GC托管堆上的数组,from[i]返回的是托管堆中Byte类型的托管左值,不属于原生C++的左值范畴。- 14.29版本之前的C++/CLI编译器对规则做了非标准放宽,允许托管左值直接绑定到原生C++的
const T&类型引用,因此此前result.push_back(from[i])可以正常编译。 - 14.29版本编译器修复了这个不合规的行为:托管堆的内存会被GC随时移动、回收,原生C++引用是固定内存地址的别名,直接绑定托管左值会出现引用悬空的安全隐患,因此不再允许托管左值直接绑定到原生的const左值引用。
- 你采用的修复方案本质是先把托管左值的值拷贝到栈上的原生变量
b,栈上的变量属于原生左值,自然可以正常绑定到push_back的const unsigned char&参数。
其他可选修复方案
你也可以选择显式强转生成临时右值来规避绑定问题,不需要额外声明变量:
result.push_back(static_cast<unsigned char>(from[i]));
内容的提问来源于stack exchange,提问作者Klaus Gütter
相关产品推荐
相关产品推荐

