C++复制初始化的限制
相比于直接初始化,复制初始化有更加严格的限制。
1:在复制初始化时,不能使用声明为explicit的构造函数进行的隐式转换。而直接初始化则是允许的:
struct Exp { explicit Exp(const char*) {} }; // not convertible from const char*
Exp e1("abc"); // OK
Exp e2 = "abc"; // Error, copy-initialization does not consider explicit constructor
struct Imp { Imp(const char*) {} }; // convertible from const char*
Imp i1("abc"); // OK
Imp i2 = "abc"; // OK
Exp类中的构造函数声明为了explicit,因此,复制初始化Exp e2 = "abc"将会发生编译错误:error: conversion from ‘const char [4]’ to non-scalar type ‘Exp’ requested.
Imp类中的构造函数没有声明为explicit,因此,可以用字符串”abc”进行直接初始化或复制初始化Imp的对象。
2:在复制初始化中,使用隐式转换时,必须是从初始化器(=右边的表达式)可以直接转换为被初始化对象,而不是间接的。在直接初始化中,可以使用从初始化器到构造函数参数的隐式转换。
struct S { S(std::string) {} }; // implicitly convertible from std::string
S s1("abc"); // OK: conversion from const char[4] to std::string
S s2 = "abc"; // Error: no conversion from const char[4] to S
S s3 = std::string("abc"); // OK: conversion from std::string to S
类S有一个接受std::string参数的构造函数,因此,可以使用”const char*”直接初始化S的对象s1。这里的转换序列是:const char* à std::string à struct S;
复制初始化中,则不允许这种转换,因为它不是直接转换,而是间接转换,因此,s2的初始化就会发生编译错误;
复制初始化中,可以使用直接隐式转换,因此,可以使用std::string的对象,初始化s3。
参考:
http://en.cppreference.com/w/cpp/language/copy_initialization
C++复制初始化的限制的更多相关文章
- C++的一大误区——深入解释直接初始化与复制初始化的区别
转自:http://blog.csdn.net/ljianhui/article/details/9245661 不久前,在博客上发表了一篇文章——提高程序运行效率的10个简单方法,对于其中最后一 ...
- C++直接初始化和复制初始化1
这篇文章主要介绍了C++直接初始化与复制初始化的区别深入解析,是很多C++初学者需要深入了解的重要概念,需要的朋友可以参考下 C++中直接初始化与复制初始化是很多初学者容易混淆的概念,本文就以实例 ...
- C++直接初始化和复制初始化2
现在正式对C++中对象建立和初始化做一个总结. (1)复制初始化的基本原理 我们知道,对象在内存中的直接表象是在内存中占有一个一定大小的空间.分配空间是建立对象的第一步.但是刚刚分配的空间就像一个没有 ...
- c++的直接初始化与复制初始化 未完成!!!!!!!!!!!!
直接初始化:是直接调用类的构造函数进行初始化.如下: string a;//调用默认构造函数 string a("hello");//调用参数为 const char* 类型的构造 ...
- [MySQL Reference Manual] 18 复制
18 复制 18 复制 18.1 复制配置 18.1.1 基于Binary Log的数据库复制配置 18.1.2 配置基于Binary log的复制 18.1.2.1 设置复制master的配置 18 ...
- Mongodb Manual阅读笔记:CH8 复制集
8 复制 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- C++复制控制
1.复制构造函数可用于: (1)根据另一个同类型的对象显示或隐式初始化一个对象 string str1="test"; //隐式 string str2=str1; //显示 ...
- C++ Primer 随笔 Chapter 13 复制控制
1.复制控制包含的内容:复制构造函数.赋值操作符.析构函数 2.复制构造函数: a. 定义:只有单个形参,而且该形参是对本类类型的引用,这样的构造函数被成为复制构造函数 b. 适用情况: (1)根据一 ...
- MySQL 复制 - 性能与扩展性的基石 2:部署及其配置
正所谓理论造航母,现实小帆船.单有理论,不动手实践,学到的知识犹如空中楼阁.接下来,我们一起来看下如何一步步进行 MySQL Replication 的配置. 为 MySQL 服务器配置复制非常简单. ...
随机推荐
- osg如何设置抗锯齿(反走样,反锯齿)
首先抗锯齿是什么? 举个最简单的例子 你用windows画图软件画一根直线(准确说这个叫做线段),当水平或者垂直的时候,如下图,这是绝对完美的 但是当线段出现倾斜时,就无法做到完美了此时就会出现锯齿 ...
- Redis 核心
一.Redis单机多实例原理 每个实例对应不同的配置文件,配置文件对应不同的端口.数据库文件位置.日志位置. 二.Redis单实例多数据库 每个Redis实例都有16个数据库,下标从0-15,当 se ...
- agc014F Strange Sorting
这套题比较简单,以为自己能够独立A掉D和E,或许就能自己A掉F,看来还真是想多了 题意:给一个$n$的全排列,每次操作把$max(a[1],a[2],...,a[i]) = a[i]$的记为$high ...
- h5文件简介
h5文件是层次格式的第5代版本,用于存储科学数据的一种文件格式和库文件,由美国超级计算中心与应用中心研发的文件格式,用以存储和组织大规模数据. H5将文件结构简化成两个主要的对象类型: 1 数据集da ...
- union 和order by 使用时排序不正确
静态专题和APP版专题(order by不起作用): [query] sql=(select sp_f13577,sp_f13576 from sp_t113 where url_1 not like ...
- win7使用经验-调整cmd窗口大小
分享一个调整cmd窗口的方法: 1.右击标题栏空白处,选择属性 2.选择布局栏 3.修改屏幕缓冲区大小的宽度和高度(自定义) 4.确定 注意:这里的缓冲区大小是指用户可拖动缩放的范围,并不是cmd窗口 ...
- 为什么要使用ul li布局网站导航条?使用ul li布局网站网页导航必要性
会布局的都知道网站导航条布局非常重要,可能一个导航条最终布局效果有时可以使用ul li列表标签布局,有时可以不用ul li布局,而是直接一个div盒子里直接放锚文本超链接的栏目名称,也能实现,看下图. ...
- ActiveMQ消息中间件
最近学习到ActiveMQ,之前也没有用过相关或者类似的工具,因此特地写个文章进行相关的学习记录. 相关参考博文:https://www.cnblogs.com/cyfonly/p/6380860.h ...
- python的pip更改源,因为我们处于局域网中
很多时候,比如网络不给力,连接超时.防火墙阻挡等等各种原因,我们可能无法从Python官方的PyPi仓库进行pip安装,这时候可以选择国内的第三方源,推荐使用豆瓣源,速度不错. 使用方法: pip i ...
- golang之if
1.if语句 (1)if (2)if else (3)if esle ...else