在c ++()或{}中委托构造函数

Gov*_*van 15 c++ constructor delegation c++11

我用以下代码阅读了Stroustrup的这个链接:

class X {
        int a;
    public:
        X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }
        X() :X{42} { }
        X(string s) :X{lexical_cast<int>(s)} { }
        // ...
    };
Run Code Online (Sandbox Code Playgroud)

我的问题是关于这条线:

X() X{42}{}

括号和大括号之间有什么区别吗?
如果没有差异,我可以在其他函数调用中使用大括号吗?或者只是在构造函数委托中?最后为什么我们应该有这两种语法?这有点暧昧.

eml*_*lai 14

()如果括号为空,则使用值初始化;如果非空,则使用直接初始化.

{}使用列表初始化,这意味着值初始化如果括号是空的,或聚合初始化,如果初始化的对象是一种聚集体.

由于你X很简单int,用()or 初始化它没有区别{}.


dsp*_*der 6

初始化值可以用括号或大括号指定。

大括号初始化是在 C++11 中引入的,它的目的是“统一初始化”,可用于所有非静态变量。

大括号可以用来代替括号或等号,引入大括号是为了提高一致性并减少混乱。

它只是一个语法结构,不会带来性能上的好处或损失。