gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:23 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com