std::visit函数中使用{}和()实例化访问器的区别是什么?
C++中
Print{}与Print()初始化对象的区别 你给出的示例中两种写法都能正常运行,核心原因是二者在当前场景下都会调用Print类的默认无参构造函数生成临时对象,传给std::visit作为可调用参数,运行效果完全一致。二者属于C++不同的初始化规则,具体区别如下:
基础定义
Print()属于值初始化语法,只会匹配类的无参构造函数完成对象初始化。Print{}是C++11引入的**列表初始化(统一初始化)**语法,初始化规则更灵活。
核心差异
- 构造函数匹配优先级不同
如果类定义了接收std::initializer_list类型参数的构造函数,Print{}会优先匹配该构造函数,而Print()只会匹配无参构造函数。 - 类型转换限制不同
列表初始化禁止窄化转换(比如将double隐式转为int丢失精度的操作),而圆括号初始化没有这个限制。比如类A有构造函数A(int x),A(3.14)可以正常编译(隐式将3.14转为3),但A{3.14}会直接编译报错。 - 聚合初始化支持不同
对于符合聚合类要求的类型(无自定义构造函数、无私有/保护非静态成员、无基类、无虚函数),列表初始化可以直接按声明顺序给成员赋值,圆括号初始化不支持该操作。比如Print类如果新增public成员int level,可以写Print{1}直接给level赋值,Print(1)没有对应的构造函数就会编译失败。
当前场景无差异的原因
你定义的Print类没有自定义构造函数、也没有std::initializer_list相关的构造函数,空圆括号和空列表初始化都会触发默认无参构造,所以两种写法效果完全相同。
内容的提问来源于stack exchange,提问作者X。
相关产品推荐
相关产品推荐

