当用"class_name obj_name {func()}"替换"class_name obj_name = func()"时有意义吗?

Rom*_*man 5 c++ initializer-list assign

在代码中,我看到以下构造:

const class_name obj_name{func()};
Run Code Online (Sandbox Code Playgroud)

func()返回一个名为的类的对象class_name.所以,我想知道为什么不使用以下结构:

const class_name obj_name = func();
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 5

const class_name obj_name{func()};
Run Code Online (Sandbox Code Playgroud)

通过编写上述内容,作者试图遵循统一的初始化语法(由C++ 11引入),以避免因烦恼的解析最烦恼的解析而导致的问题,甚至有经验的程序员也会陷入困境.他试图将最佳实践灌输到他的大脑中,这样他就不会偶尔陷入上述解析问题,如下所述.

想想这个,

struct X { /*....*/ }; // some class

struct Y 
{
    Y();
    Y(int i);
    Y(X x);
};
Run Code Online (Sandbox Code Playgroud)

现在可以写这个:

Y y(100); // declare an object y of type Y
Run Code Online (Sandbox Code Playgroud)

调用第二个构造函数,这很好.到目前为止,真好!

但无意中甚至写了一个:

Y y(); 
Run Code Online (Sandbox Code Playgroud)

(错误地)认为它调用默认构造函数.但事实是它不会调用默认构造函数.它改为声明一个y不带参数的函数,然后返回Y.这在C++中称为vexing parse.

同样,人们可以写这个(意外),

Y y(X());
Run Code Online (Sandbox Code Playgroud)

认为它调用第三个构造函数传递一个动态X创建的类型的对象.再次,这是错误的.它改为声明一个函数y,它接受一个函数指针(函数类型函数,它不需要任何东西并返回X)并返回Y.它在C++中被称为最令人烦恼的解析.

所以统一的初始化语法避免了所有这些问题,你可以这样写:

Y y1{};      // invokes 1st constructor
Y y2{100};   // invokes 2nd constructor
Y y3{X{}};   // invokes 3rd constructor
Run Code Online (Sandbox Code Playgroud)

并遵循相同的语法,

Y { function_call() }; 

const class_name obj_name { func() }; // taken from your question!
Run Code Online (Sandbox Code Playgroud)

这是统一的,当然是最好的做法,不是吗?

希望有所帮助.