You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::vector<std::any>在GCC与MSVC中结果不同?如何修正MSVC行为

GCC与MSVC下std::vectorstd::any初始化结果差异及解决方法

这段代码在GCC和MSVC中运行结果存在差异:

GCC输出:
myVector size is 1
myVector2 size is 2

MSVC输出:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:52:41