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)
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)
这是统一的,当然是最好的做法,不是吗?
希望有所帮助.
归档时间: |
|
查看次数: |
110 次 |
最近记录: |