构造对象时 c++ 中的括号和大括号有什么区别

What's the difference between parentheses and braces in c++ when constructing objects

本文关键字:区别 什么 对象 c++      更新时间:2023-10-16

构造对象时(){}有什么区别?

我认为{}只能支持initializer_list或一个数组,但是当我在snip下运行时,我感到困惑。

#include <iostream>
using namespace std;
struct S {
    int v=0;
    S(int l) : v(l) {
    }
};

int main()
{
    S s1(12); // statement1
    S s2{12}; // statement2
    cout << s1.v << endl;
    cout << s2.v << endl;
}

statement1是正确的,因为 ()是构造对象的基本语法。

我预计statement2将被编译为失败。我认为{}仅可用于数组或initializer_list类型。但是实际结果完美地编译而没有错误。

我误会了什么?

对于S,它们具有相同的效果。两者都调用构造函数S::S(int)初始化对象。

S s2{12};被重新为列表初始化(因为C 11(;S不是聚合类型,而不是std::initializer_list,也没有std::initializer_list的构造函数,然后没有

如果上一个阶段不产生匹配项,则T的所有构造函数都参与过载分辨率,该分辨率与由Brad-Init-list元素组成的一组参数,并受到限制,仅允许使用非核心转换。

你以为

我认为{}仅可用于数组或initializer_list类型。

这是不正确的。列表定位的效果是,例如如果S是一种聚合类型,则执行聚合初始化;如果Sstd::initializer_list的专业化,则将其初始化为std::initializer_list;如果S的构造函数服用std::initializer_list,则首选用于初始化。您可以参考链接的页面以获取更精确的详细信息。

ps:S s1(12);执行直接初始化。