在代码中我看到了以下结构:
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/