.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. Nginx 配置优化

    一.开启Gzip 1.参数 gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_comp_level 2;gzip_types text/plain ...

  2. Restful风格wcf调用

    文章:Restful风格wcf调用 作者相当于把wcf服务改造成rest风格. Restful风格wcf调用2——增删改查 这篇文章在第一篇的基础上,进行了优化. Restful风格wcf调用3——S ...

  3. 【CSAPP笔记】1. 位、字节、整型

    <Computer Systems a Programmer's Perspective>,机械工业出版社.中文译名<深入理解计算机系统>.作者:(美)Randal E.Bry ...

  4. CSS+JS笔记

    CSS篇: 1.a标签去掉下划线 a { text-decoration:none; }

  5. 关于supervisor无法监控golang代码的解决方法

    之前一直都是使用如下方式运行go代码 # go run test.go 这种运行方式是直接编译运行go代码,虽然在调试的时候没出什么问题,但是在使用supervisor监控的时候,会提示如下错误:(b ...

  6. poj 2299 Ultra-QuickSort(树状数组求逆序数)

    链接:http://poj.org/problem?id=2299 题意:给出n个数,求将这n个数从小到大排序,求使用快排的需要交换的次数. 分析:由快排的性质很容易发现,只需要求每个数的逆序数累加起 ...

  7. mysql实现消息队列

    mysql之消息队列   消息队列:在消息的传输过程中保存消息的容器. 消息队列管理器在将消息从它的源中继到它的目标时充当中间人.队列的主要目的是提供路由并保证消息的传递:如果发送消息时接收者不可用, ...

  8. html实现鼠标悬停变成手型实现方式

    1.采用a标签实现的方式 <a href="javascript:void()">内容</a> 2.采用CSS实现的方式 // 变手形 oElement.s ...

  9. HDU4183_Pahom on Water

    题意为给你若干个圆,每个圆的颜色对应一个频率,如果两个圆有公共部分,那么这两个圆之间可以走,你可以从起点开始,从频率小的圆走向频率大的圆并且到达终点后,从频率大的圆走向频率小的圆,最终回到起点,路径中 ...

  10. 一条慢SQL引发的血案

    直接切入正题吧: 通常来说,我们看到的慢查询一般还不致于导致挂站,顶多就是应用响应变慢不过这个恰好今天被我撞见了,一个慢查询把整个网站搞挂了先看看这个SQL张撒样子: # Query_time: 70 ...