为了账号安全,请及时绑定邮箱和手机立即绑定

C-like,构造函数和统一初始化之间有什么区别?

C-like,构造函数和统一初始化之间有什么区别?

C++
开满天机 2019-08-17 16:28:18
C-like,构造函数和统一初始化之间有什么区别?据我所知,有三种方法可以在C ++中初始化变量。int x = 0;    // C-like initializationint x (0);    // Constructor initializationint x {0};    // Uniform initialization为C ++ 11引入了统一初始化,以便为初始化不同类型的变量提供更加统一的语法,这需要在C ++ 03中使用不同的语法。C-like,构造函数和统一初始化之间有什么区别?我应该总是使用统一初始化吗?
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

c-like,构造函数和统一初始化之间有什么区别?


对于原始类型int,没有实际的区别; 所以让我们考虑一个类类型T。


第一种风格相当于


T x(T(0));

从初始化表达式创建临时对象,然后x通过移动或复制它来初始化。在实践中,移动或复制将被省略,因此结果与第二种风格相同; 唯一的区别是,如果没有可访问的副本或移动构造函数,第一个将失败。


第二个使用带有一个参数的构造函数直接初始化对象,如果没有合适的构造函数则给出错误。


第三个取决于可用的构造函数。


如果有一个构造函数std::initializer_list,它会使用它;

否则,如果有一个构造函数采用合适类型的单个参数,它会使用它;

否则,如果它是具有一个成员的聚合(没有构造函数),则该成员初始化为零;

否则,这是一个错误。

我应该总是使用统一初始化吗?


没有。有时您需要函数式初始化来区分initializer_list构造函数和采用其他参数类型的构造函数。例如:


std::vector<int> v1(10, 42);  // 10 elements with value 42

std::vector<int> v2{10, 42};  // 2 elements with values 10 and 42

你也不应该称它为“统一初始化”,因为它在任何有意义的意义上都不是“统一的”。官方术语是“支撑初始化”。


查看完整回答
反对 回复 2019-08-17
  • 2 回答
  • 0 关注
  • 667 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信