.C++中指定初始化值的方式有4种方式:
()小括号 int x();
()等号 int x = ;
()大括号 int x{};
()等号和大括号 int x = {}; .C++11统一初始化, 即使用大括号初始化方式, 其使用场景主要有以下3种:
()类非静态成员指定默认值
()为容器赋值 vector<int> vec = {, , };
()对不支持拷贝操作的对象赋值 unique_ptr<int> p{};
之所以称为统一初始化, 其原因在于上述3种使用场景中,
第()种不支持小括号;
第()种不支持等号和小括号;
第()种不支持等号. .统一初始化的优势:
()能禁止内置类型之间的隐式窄化转换, 即表达式无法保证接收对象能够表达其值, 则代码不能通过编译(至少会给出编译警告)!
如 double d{}; long x{d};
()可以有效解决小括号定义对象却解析为声明函数的问题.
如 int x(); 声明为函数 x 而不是定义变量, 使用统一初始化则不会出现问题. .统一初始化的不足:
不足之处在于重载匹配过程变得更加复杂, 难于理解:
()对重载函数, 统一初始化使用大括号会将数据声明为 initializer_list 对象,
只有重载匹配过程中, 无法找到 initializer_list类型的形参时, 其它函数才会成为可选函数.
因此, 对声明了 initializer_list 形参的重载函数, 则使用统一初始化的代码会优先匹配该函数, 而其他更精确匹配的版本可能没有机会被匹配.
其中需要特别注意的是经常使用容器 vector.
如 vector<int> vec(, ) 和 vector<int> vec{,}, 前者是含有 个元素的对象, 而后者是只包含 和 两个元素的对象.
()对于构造函数, 空大括号构造一个对象时, 不是匹配 initializer_list 形参的版本, 而是默认构造函数.
class Test
{
public:
Test()
{
PRINT_POS();
}
template <typename T>
Test(std::initializer_list<T> ls)
{
Q_UNUSED(ls);
PRINT_POS();
}
};
进行如下调用时,
Test t1{};
Test t2{};
// Test t3{{}}; //error: no matching function for call to 'Test::Test(<brace-enclosed initializer list>)'
Test t4{{}};
Test t5({});
其中 t1 和 t5 使用默认构造函数, t2 和 t4 使用列表初始化构造函数, t3 则不能定义.
()对于 initializer_list 模板特例化版本, 情形较第2种又有所不同.
a. void foo(int);
b. template <typename T>
void foo(initializer_list<T> lsi);
当进行以下函数调用 foo(); foo({}); foo({}); 时, 分别调用的是 a, a, b.
c. void foo(int);
d. void foo(initializer_list<int> lsi);
当进行以下函数调用 foo(); foo({}); foo({}); 时, 分别调用的是 c, d, d.

C++统一初始化的更多相关文章

  1. C++11 带来的新特性 (2)—— 统一初始化(Uniform Initialization)

    1 统一初始化(Uniform Initialization) 在C++ 11之前,所有对象的初始化方式是不同的,经常让写代码的我们感到困惑.C++ 11努力创造一个统一的初始化方式. 其语法是使用{ ...

  2. 【ZZ】C++11之统一初始化语法 | 桃子的博客志

    C++11之统一初始化语法 | 桃子的博客志 https://taozj.net/201710/list-initialize.html 在当前新标准C++11的语法看来,变量合法的初始化器有如下形式 ...

  3. C++统一初始化语法(列表初始化)

    引言 要是世上不曾存在C++14和C++17该有多好!constexpr是好东西,但是让编译器开发者痛不欲生:新标准库的确好用,但改语法细节未必是明智之举,尤其是3年一次的频繁改动.C++带了太多历史 ...

  4. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...

  5. C++11初始化列表

    [C++11之初始化列表] 在C++03中,在严格遵守POD的定义和限制条件的结构及类型上可以使用初始化列表(initializer list),构想是结构或是数组能够依据成员在该结构内定义的顺序通过 ...

  6. tomcat生命周期的管理——生命周期统一接口Lifecycle

    我们知道Tomcat的架构设计是清晰的.模块化的,其拥有很多组件,假如我们要启动Tomcat,可以一个一个启动组件,但这样启动有很多缺点,不仅麻烦,而且容易漏了组件启动,还会对后面动态组件扩展带来麻烦 ...

  7. C++11 列表初始化

    在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体: ...

  8. C++11 初始化

    C++11 初始化 统一初始化语法        C++11新添加初始化列表 std::initializer_list<>类型,可以通过{}语法来构造初始化列表 .初始化列表是常数:一旦 ...

  9. NO.4: 确定对象被使用前已被初始化

    1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始 ...

随机推荐

  1. vi/vim命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/mondol/p/vi-examples.html 进入vi vi filename # 打开或新建文件,并将光标置于第 ...

  2. java基础学习总结——线程(二)

    一.线程的优先级别

  3. 将eclipse上的web项目部署到Tomcat服务器上经验总结

    1.  将Tomcat插件添加到eclipse上 Window --> Preferences --> Server --> Runtime Environment --> A ...

  4. 团队冲刺--Seven

    昨天: 司宇航:测试功能版块,优化功能版块. 马佳慧:优化界面 . 王金萱:合并程序. 季方:  合并程序. 今天: 司宇航:优化功能版块. 马佳慧:优化界面 . 王金萱:优化界面. 季方:  完善功 ...

  5. 【搜索】POJ-2718 全排列+暴力

    一.题目 Description Given a number of distinct decimal digits, you can form one integer by choosing a n ...

  6. coreseek优化

    问题前提: 这篇博客是在你已经安装并使用coreseek的前提下,并且在使用过程中发现当前默认的分词效果不佳时作为参考. 解决方案: 1.扩展基本词典 参考: http://jockchou.gith ...

  7. A网站访问B网站,跨域问题

    跨域异常:XMLHttpRequest cannot load  ''. No 'Access-Control-Allow-Origin' header is present on the reque ...

  8. Windows10(UWP)下的MEF

    前言 最近在帮一家知名外企开发Universal Windows Platform的相关应用,开发过程中不由感慨:项目分为两种,一种叫做前人栽树后人乘凉,一种叫做前人挖坑后人遭殃.不多说了,多说又要变 ...

  9. Delphi中比较两个对象是否一致及地址是否相同[转]

    在delphi中,C#也是如此,对象的地址与对象变量(引用)的地址不是同一个概念.要加以区别. procedure TForm1.btn1Click(Sender: TObject); var    ...

  10. 七类网线 支持10gb/s的速度的计算方法

    0. 说明 我是数学白痴, 只是套了下公式... 1. 七类网线的参数: 七类线 ISO/IEC 7类/F级标准 中最新的一种双绞线,它主要为了适应万兆位以太网技术的应用和发展.但它不再是一种非屏蔽双 ...