为何std::vector<std::any>在GCC与MSVC中结果不同?如何修正MSVC行为
GCC与MSVC下std::vectorstd::any初始化结果差异及解决方法
这段代码在GCC和MSVC中运行结果存在差异:
GCC输出:
myVector size is 1
myVector2 size is 2MSVC输出:
myVector size is 3
myVector2 size is 2
测试代码如下:
#include <iostream> #include <vector> #include <any> int main() { std::vector<std::any> myVector = { std::vector<std::any>{1, 2, 3} }; std::cout << "myVector size is " << myVector.size() << std::endl; std::vector<std::any> myVector2 = { std::vector<std::any>{1, 2, 3}, std::vector<std::any>{1, 2, 3} }; std::cout << "myVector2 size is " << myVector2.size() << std::endl; return 0; }
问题原因
MSVC编译器处理单元素初始化列表时,错误地将内部的std::vector<std::any>{1,2,3}隐式转换为std::initializer_list<std::any>,导致myVector被初始化为包含3个独立的std::any元素(对应数值1、2、3),而非预期的1个std::vector<std::any>类型的std::any元素。当初始化列表包含两个元素时,编译器能正确识别每个元素的类型,因此myVector2的大小符合预期。
解决方案(无需使用push_back)
方法1:显式构造std::any
将内部vector显式包装为std::any,避免隐式转换:std::vector<std::any> myVector = { std::any(std::vector<std::any>{1, 2, 3}) };方法2:嵌套大括号明确类型
通过额外一层大括号,让编译器正确识别元素类型为包含vector的std::any:std::vector<std::any> myVector = { {std::vector<std::any>{1, 2, 3}} };方法3:使用emplace_back
若允许替代push_back,可直接在容器内构造元素:std::vector<std::any> myVector; myVector.emplace_back(std::vector<std::any>{1, 2, 3});
内容的提问来源于stack exchange,提问作者YoHen Fu
相关产品推荐
相关产品推荐

