C++中`T object(other);`属于直接初始化还是拷贝初始化?
关于
T object(other);的初始化类型判定 首先明确结论:T object(other);无论other与T类型是否相同,都属于直接初始化,你最初的判断是正确的,那个“同类型为拷贝初始化”的说法是错误的。
- 从C++标准的定义来看,直接初始化的场景就包含「
T object(arg);这种带非空括号表达式列表的对象初始化」,只要是用括号包裹初始化参数的形式,就属于直接初始化的范畴,和参数的类型无关。 - 拷贝初始化的典型场景是使用等号的形式,比如
T object = other;,另外还包括一些隐式触发的场景:比如函数按值传递参数、函数按值返回对象、用花括号初始化但省略等号且需要隐式转换的情况。 - 两者的核心区别之一是构造函数的调用限制:直接初始化可以调用
explicit修饰的构造函数,而拷贝初始化只能调用非explicit的构造函数。举个例子,如果T的拷贝构造函数被explicit修饰,T object = other;会编译失败,但T object(other);可以正常编译,这也能直观证明两者的差异。
内容的提问来源于stack exchange,提问作者Kevin eyeson
相关产品推荐
相关产品推荐

