c++ - 什么时候用 "class_name obj_name = func()"替换 "class_name obj_name{func()}"有意义?

标签 c++ assign initializer-list

在代码中我看到了以下结构:

const class_name obj_name{func()};

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

const class_name obj_name = func();

最佳答案

const class_name obj_name{func()};

作者通过写上面的代码,试图遵循统一初始化语法(C++11引入),从而避免繁琐的解析最令人烦恼的解析,即使是经验丰富的程序员也会意外陷入其中。他正试图将最佳实践灌输到他的大脑中,这样他就不会偶尔陷入上述解析问题,如下所述。

考虑一下,

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

struct Y 
{
    Y();
    Y(int i);
    Y(X x);
};

现在可以这样写了:

Y y(100); // declare an object y of type Y

调用第二个构造函数,这很好。到目前为止,一切顺利!

但不小心有人甚至写了这个:

Y y(); 

(错误地)认为它调用了默认构造函数。但事实是它不调用默认构造函数。相反,它声明了一个函数 y,它不接受任何参数,并返回 Y。这在 C++ 中称为 vexing parse

同样,可以(不小心)这样写,

Y y(X());

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

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

Y y1{};      // invokes 1st constructor
Y y2{100};   // invokes 2nd constructor
Y y3{X{}};   // invokes 3rd constructor

并遵循相同的语法,

Y { function_call() }; 

const class_name obj_name { func() }; // taken from your question!

这是统一的,当然是最佳实践,不是吗?

希望对您有所帮助。

关于c++ - 什么时候用 "class_name obj_name = func()"替换 "class_name obj_name{func()}"有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15759546/

相关文章:

c++ - CGAL:多边形重叠测试

c++ - 将多维数组分配给另一个

c - 为什么我们在全局区域空间定义为全局变量后不能给变量赋值

c++ - 为什么以下 c++11 程序会导致 visual studio 2013 Express Edition 崩溃?

c++ - 无法使用 Microsoft Visual Studio 2012 列出初始化 vector

Eclipse 代码样式格式化程序 : How to keep closing braces of initializer list in seperate line?

c++ - 在 iOS 中使用 C++ fuzzylite 库和 ObjC(模糊逻辑)

c++ - 为什么我在这里需要复制构造函数

c++ - appendChild xml c++ 无法按需工作

Python 数据框使用带有 2 个变量的 lambda 函数和 if else 语句分配新列