list-initialization相关内容
直接- ;与 ;复制初始化 通过这个问题(Is it direct-initialization or copy-initialization?)我了解了直接初始化和复制初始化的区别: direct-initialization copy-initialization -----------------------
..
[dcl.init]/17.6中明确写到,初始化圆括号时,会发生副本省略: 如果初始化器表达式是prvalue,并且源类型的cv非限定版本与目标的类相同,则初始化器表达式用于初始化目标对象。[ 示例:T x=T());调用T默认构造函数初始化x。 - 结束示例 ] 但是在列表初始化的情况下(上面的段落不适用),我没有发现任何类似的东西。请参见[dcl.init.list]。 那么
..
对我来说,pair 只是 tuple 的特例,但以下让我感到惊讶: pairp1(1, 2);//行元组t1(1, 2);//行对p2={1, 2};//行元组t2={1, 2};//编译错误 为什么我们用{}来初始化tuple会有区别? 我什至尝试了 g++ -std=c++1y 但仍然有错误: a.cc: 在函数'int mai
..
声明是什么 返回{}; 在 C++11 中指明,以及何时使用它来代替(说) 返回NULL; 或 return nullptr; 解决方案 return {};表示“返回一个用空list-initializer".确切的行为取决于返回对象的类型. 来自 cppreference.com (因为 OP 标记为 C++11,我排除了C++14 和 C++17 中的规则;详情请参阅链接
..
在C++11中有两种初始化变量的方法: T a {something};T a = {某事}; 我在我能想到的所有场景中都测试了这两个,但我没有注意到其中的差异.这个答案表明两者之间存在细微差别: 对于我不太注意 T t = { init }; 或 T t { init }; 样式之间的变量,我发现区别在于次要的,最坏的情况只会导致关于滥用显式构造函数的有用编译器消息. 那么,这两
..
MyClass a1 {a};//比其他三个更清晰,更不容易出错我的类 a2 = {a};我的班级 a3 = a;我的类 a4(a); 为什么? 解决方案 基本上是从 Bjarne Stroustrup 的 “The C++ Programming Language 4th Edition"中复制和粘贴: 列表初始化不允许缩小 (§iso.8.5.4).那就是: 一个整数不能
..
当我运行此代码时: struct X {一个;};结构 Y : 公共 X {};X X = {0};Y Y = {0}; 我明白了: error: 无法将“{0}"从“"转换为“Y" 为什么花括号初始化对基类有效,而对派生类无效? 解决方案 针对C++17之前的C++标准版本的回答: 您的问题与聚合初始化有关:structX 是一个聚合,而 struct Y 不是.以下是关于
..
我知道,给定一个花括号初始化器,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).即: 一个整数不能转换成另一个不能保持其值的整数.例如,字符允
..
我对 C++ 编程有点陌生.我在谷歌的任何地方都找不到我的答案,所以希望它可以在这里得到解答. 以下有区别吗 unsigned int counter{ 1 }; 或 unsigned int counter = 1; 这本书使用了第一个选项,这让我感到困惑,因为它没有解释差异.以下是我正在关注的书中的以下代码. #include #include #include //包含 ra
..
假设我具有以下结构和两个版本来对其进行初始化: #includetypedef struct Car * CarPtr;typedef struct Car {const char *名称;unsigned int价格;} 车;int main(void){汽车福特= {.name =“福特F-150&",.price = 25000};print_struct(& for
..
我劝说我的矩阵类构造函数使用嵌套的std :: initializer_list进行大括号括起来的初始化.构造函数可以很好地处理主类型:`int`,`double`;.但是会为`complex`提供错误读取.如何解决此错误阅读? 矩阵类 模板xxx级{上市:T * ptr;整数,行,大小;xxx()=删除;xxx(const int i,const int j):
..
两种初始化形式T obj = {...}和T obj{...}有什么区别? 最初,我认为T obj = {...}是T obj = T{...}的简写,其中将一个临时对象复制到了我们的新对象中.尽管它不执行复制构造函数(复制省略),但需要它的存在和访问权限做到这一点.但是,当我通过使构造函数私有化来阻止对特定类的复制构造函数访问时,没有错误. 这意味着不涉及复制机制.那么'='符号的作用是什么
..
要了解该问题,请先阅读此答案. 我检查了不同的历史性make_tuple实现(包括2012年的clang版本).在C ++ 17之前,我期望它们为return {list of values ... },但是它们都在返回元组之前先构造了元组.它们与非常简化的当前cppreference示例大致相同: template auto make_tuple(T
..
请参见以下代码: std::vector v1{1, 2, 3}; std::vector v2 = {1, 2, 3}; 我的问题是: 两者之间有区别吗?我知道第一个必须是列表初始化,但是第二个应该如何? 因为第二个有一个赋号,所以我认为编译器将首先使用std::initializer_list创建一个临时vector,然后使用复制构造函数复制临时vec
..
#include #include #include
..
我在cpp参考网站上阅读了有关缩小转换的信息.我有点理解,但是我没有得到的是为什么错误仅出现在第一行. long double ld = 3.1415926536; int a{ld}, b = {ld}; // error: narrowing conversion required int c(ld), d = ld; // ok: but value wil
..
在C ++ 11中,我具有以下联合: union SomeData { std::uint8_t Byte; std::uint16_t Word; std::uint32_t DWord; unsigned char String[128]; }; 如果我这样初始化联合; SomeData data {}; 是否保证联合的 entire 内容将
..
在尝试使用括号初始化时,在使用std::vector时会发现一个微妙之处,如以下示例所示: #include #include #include using namespace std; template void print(const char * msg, const vector& v) {
..
有人可以帮助我理解为什么我的编译器不能/不可以推断出这一点吗? (使用g ++ 7.3) 不起作用: #include std::array,2> f() { return {{0,0},{0,0}}; } 工作正常: #include std::array,
..