C ++ 11和广义初始化程序约定

用户877329

C ++ 11带来了新的通用初始化器,可能很好。问题:是否已废弃任何用于初始化对象的旧语法?在C ++ 03中,可以将对象初始化为

  1. Foo bar(x)
  2. Foo bar=Foo(x)

选项(1)是首选,因为它不涉及副本。在C ++ 11中,有更多方法:

  1. Foo bar{x}
  2. auto bar=Foo{x}

对于move构造函数和赋值运算符,选项(4)也应该很好。是否赞成(3)或(4)弃用(1)?

同样,在C ++ 03中,规则是所有带有一个参数的构造函数都应是显式的(复制ctor除外)。其他构造函数始终是显式的。使用通用的初始化程序,任何ctor都可以是隐式的。然后,新规则是否在所有地方都明确显示,或者只是在转换将隐含副作用(分配一堆内存,创建文件...)或有损(双精度浮点数)的地方?

熔化

是否赞成(3)或(4)弃用(1)?

不推荐使用的单词可能不是最佳选择。可能的话,最好使用花括号初始化我提到这一点是因为Foo(x)它并不总是与之相对应Foo{x}

考虑以下构造函数std::vector

std::vector<int> v1(10, 0); // Creates a vector of size 10 initialized with all 0's.
std::vector<int> v2{10, 0}; // Creates a vector with elements {10, 0}.

ctor之间的行为有所不同。因此,说(1)应该代替(3)或(4)放弃是不公平的。

此示例回答了您的第二个问题:

那么,新规则是explicit无处不在吗?

是。因为会有歧义,所以您不希望编译器尝试解决它-将其标记为explicit

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++ 11初始化程序列表失败-但仅在长度为2的列表上

C ++ 11统一初始化:初始化列表和多参数构造函数之间的歧义?

为什么C ++ 11类内初始化程序不能使用括号?

在C中为struct指定的初始化程序和复合文字

为什么在C ++ 11 / C ++ 14中针对自动和支撑初始化程序有特殊的类型推导规则?

在C ++(98、11和14)中初始化静态数据成员的正确方法是什么?

c ++ 11全局初始化顺序和thread_local

具有非静态成员初始化程序的类的C ++ 11聚合初始化

C ++ 11 / C ++ 14中的自动和括号初始化

C struct初始化和指针

C ++ 11统一初始化和函数重载

在C ++ 11中初始化结构的C ++ std :: array

静态订单初始化失败,iostream和C ++ 11

向量初始化的C ++ 11向量

c ++ 11:枚举成员初始化

从linux信号处理程序初始化c ++ 11函数静态变量是否安全?

C ++ 11整数初始化

C“错误:无效的初始化程序”

C ++:array <>初始化程序过多

在c ++ 11中,您是否可以始终(安全)用空的初始化程序替换memset()初始化?

自动进行C ++ 11初始化

C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

C ++ 11中的数组声明和初始化

具有括号括起来的初始化程序列表的C ++ 11 g ++

使用XCode的REGEX搜索/替换将()更改为{}(C ++ 11初始化程序)

C ++ 11 Lambda初始化的惩罚

c ++ 11初始化程序列表作为数组

C ++ 11类初始化错误

在 C++11/17 中的类初始化和直接初始化中。有什么区别?