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

标签 c++ c++11

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

初始化一个结构体:

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 are favored over other constructors in list-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/

相关文章:

c++ - 替换 std::binary_function

c++ - 使用基于嵌套值的索引 boost 多索引容器

c++ - 为什么类模板的成员函数声明都应该是良构的?

c++ - 使用 C++ 中的信号更改 std::thread 执行流程

windows - MinGW g++ : Multiple definition of vsnprintf when using to_string

c++ - 未能从 lambda 函数中推断出模板参数 std::function

c++ - 创建项目,从 Makefile 到 UNIX 中的静态/动态库

c++ - 稳定的时钟在系统范围内稳定吗?

c++ - 在 C++11 中,将引用/指针返回到 std::string 中某个位置的最高效方法是什么?

c++ - "const char(&a)[N]"是什么意思?