list-initialization相关内容

复制省略用于列表初始化,它在标准中规定在哪里?

[dcl.init]/17.6中明确写到,初始化圆括号时,会发生副本省略: 如果初始化器表达式是prvalue,并且源类型的cv非限定版本与目标的类相同,则初始化器表达式用于初始化目标对象。[ 示例:T x=T());调用T默认构造函数初始化x。 - 结束示例 ] 但是在列表初始化的情况下(上面的段落不适用),我没有发现任何类似的东西。请参见[dcl.init.list]。 那么 ..

“返回{}"是什么意思?语句在 C++11 中是什么意思?

声明是什么 返回{}; 在 C++11 中指明,以及何时使用它来代替(说) 返回NULL; 或 return nullptr; 解决方案 return {};表示“返回一个用空list-initializer".确切的行为取决于返回对象的类型. 来自 cppreference.com (因为 OP 标记为 C++11,我排除了C++14 和 C++17 中的规则;详情请参阅链接 ..
发布时间:2022-01-19 15:34:07 C/C++开发

等号对大括号初始化有影响吗?例如.'T a = {}' 与'T a{}'

在C++11中有两种初始化变量的方法: T a {something};T a = {某事}; 我在我能想到的所有场景中都测试了这两个,但我没有注意到其中的差异.这个答案表明两者之间存在细微差别: 对于我不太注意 T t = { init }; 或 T t { init }; 样式之间的变量,我发现区别在于次要的,最坏的情况只会导致关于滥用显式构造函数的有用编译器消息. 那么,这两 ..
发布时间:2022-01-18 23:46:19 C/C++开发

为什么我不能大括号初始化从另一个结构派生的结构?

当我运行此代码时: struct X {一个;};结构 Y : 公共 X {};X X = {0};Y Y = {0}; 我明白了: error: 无法将“{0}"从“"转换为“Y" 为什么花括号初始化对基类有效,而对派生类无效? 解决方案 针对C++17之前的C++标准版本的回答: 您的问题与聚合初始化有关:structX 是一个聚合,而 struct Y 不是.以下是关于 ..
发布时间:2021-12-23 16:56:09 C/C++开发

为什么花括号初始化器的自动和模板类型推导不同?

我知道,给定一个花括号初始化器,auto 将推导出 std::initializer_list 的类型,而模板类型推导将失败: auto var = { 1, 2, 3 };//类型推导为 std::initializer_list模板void f(T 参数);f({ 1, 2, 3 });//不编译;类型推导失败 我什至知道这是在 C++11 标准中指定的地方:14.8.2.5/5 bull ..

为什么列表初始化(使用花括号)比替代方法更好?

MyClass a1 {a};//比其他三个更清晰,更不容易出错我的类 a2 = {a};MyClass a3 = a;MyClass a4(a); 为什么? 解决方案 基本上是从 Bjarne Stroustrup 的“C++ 编程语言第 4 版"中复制和粘贴: 列表初始化不允许缩小范围(§iso.8.5.4).即: 一个整数不能转换成另一个不能保持其值的整数.例如,字符允 ..
发布时间:2021-12-01 15:07:15 C/C++开发

{ } 和等号变量的区别

我对 C++ 编程有点陌生.我在谷歌的任何地方都找不到我的答案,所以希望它可以在这里得到解答. 以下有区别吗 unsigned int counter{ 1 }; 或 unsigned int counter = 1; 这本书使用了第一个选项,这让我感到困惑,因为它没有解释差异.以下是我正在关注的书中的以下代码. #include #include #include //包含 ra ..

矩阵构造函数的括号括起的初始化程序在std :: complex< double>类型中失败.>

我劝说我的矩阵类构造函数使用嵌套的std :: initializer_list进行大括号括起来的初始化.构造函数可以很好地处理主类型:`int`,`double`;.但是会为`complex`提供错误读取.如何解决此错误阅读? 矩阵类 模板xxx级{上市:T * ptr;整数,行,大小;xxx()=删除;xxx(const int i,const int j): ..
发布时间:2021-04-20 18:52:19 C/C++开发

C ++中的对象初始化语法(T obj = {...} vs T obj {...})

两种初始化形式T obj = {...}和T obj{...}有什么区别? 最初,我认为T obj = {...}是T obj = T{...}的简写,其中将一个临时对象复制到了我们的新对象中.尽管它不执行复制构造函数(复制省略),但需要它的存在和访问权限做到这一点.但是,当我通过使构造函数私有化来阻止对特定类的复制构造函数访问时,没有错误. 这意味着不涉及复制机制.那么'='符号的作用是什么 ..

列表初始化的形式

请参见以下代码: std::vector v1{1, 2, 3}; std::vector v2 = {1, 2, 3}; 我的问题是: 两者之间有区别吗?我知道第一个必须是列表初始化,但是第二个应该如何? 因为第二个有一个赋号,所以我认为编译器将首先使用std::initializer_list创建一个临时vector,然后使用复制构造函数复制临时vec ..