gpt4 book ai didi

c++ - C++0x中的统一初始化,什么时候用()代替{}?

转载 作者:IT老高 更新时间:2023-10-28 23:18:34 26 4
gpt4 key购买 nike

是否有经验法则来决定何时使用旧语法 () 而不是新语法 {}

初始化一个结构体:

struct myclass
{
myclass(int px, int py) : x(px), y(py) {}
private:
int x, y;
};
...
myclass object{0, 0};

现在以 vector 为例,它有许多构造函数。每当我执行以下操作时:

vector<double> numbers{10};

我得到一个 1 元素的 vector ,而不是一个带有 10 元素的 vector ,因为构造函数之一是:

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

我的怀疑是,每当一个类定义一个 initializer list 构造函数时,就像 vector 的情况一样,它会被 {} 语法。

所以,我的想法是正确的。即 我是否应该仅在类定义初始化列表构造函数以调用不同的构造函数时才恢复到旧语法? 例如更正上面的代码:

vector<double> numbers(10); // 10 elements instead of just one element with value=10

最佳答案

我在标准文档 (latest draft) 中找到了答案。希望我会尝试解释我的理解。

首先,如果一个类定义了一个初始化列表构造函数,那么它会在合适的时候使用:

§ 8.5.4 (page 203)

Initializer-list constructors arefavored over other constructors inlist-initialization (13.3.1.7).

我认为这是一个很棒的功能,消除了与 non-uniform 样式相关的头痛:)

无论如何,唯一的问题(我的问题是关于)是,如果您设计一个没有初始化构造器的类,那么稍后添加它可能会得到令人惊讶的结果。

基本上,假设 std::vector 没有初始化列表构造函数,那么下面将创建一个包含 10 个元素的 vector :

std::vector<int> numbers{10};

通过添加初始化列表构造函数,由于 {} 语法,编译器会优先使用它而不是其他构造函数。之所以会发生这种行为,是因为使用 init-list 构造函数接受了 init-list {10} 的元素。如果没有可接受的转换,则应使用任何其他构造函数,例如:

std::vector<string> vec{10};
// a vector of 10 elements.
// the usual constructor got used because "{0}"
// is not accepted as an init-list of type string.

关于c++ - C++0x中的统一初始化,什么时候用()代替{}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1863784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com