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

C++可变参数模板构造函数填充std::variant类型内部vector问题

问题原因

编译错误来自std::vector的构造函数重载决议优先级问题:
std::vector的构造函数中,vector(size_type count, const T& value)(构造包含count个value副本的vector)的重载优先级高于接收std::initializer_list<T>的重载。你直接将参数包展开传入data({arguments...})时,编译器没有自动将所有参数隐式转换为std::variant<int, float>,反而尝试将参数匹配到count + value的构造函数重载,因此出现了将float类型参数转换为无符号整数类型size_type的窄化错误。

解决方案

在参数包展开时显式将每个参数转换为std::variant<int, float>类型,让编译器直接匹配vector的initializer_list构造函数即可,同时可以添加完美转发逻辑避免不必要的值拷贝:

#include <string>
#include <vector>
#include <variant>
#include <utility>

class A {
  std::string name;
  std::vector<std::variant<int,float>> data; 
public:
  template <typename... ARGS>
  A(std::string n, ARGS&&... arguments) 
    : name(std::move(n)), 
      data{std::variant<int, float>(std::forward<ARGS>(arguments))...} {}
};

修改后初始化列表的每个元素都是明确的std::variant<int, float>类型,重载决议会直接匹配对应initializer_list的构造函数,不会再触发窄化错误。

注意:类的构造函数需要声明为public权限,才能被外部代码调用初始化实例。

内容的提问来源于stack exchange,提问作者Behrang Javaherian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:27:05