关于initializer_list
在C ++中的工作方式,我有几个问题。首先,说我们有(为简单起见,省略了std ::):
initializer_list<uint32_t> lst({ 5,4,3 }); // (*)
在Visual Studio中,我对该类进行了深入研究,只发现了以下两个构造函数:
constexpr initializer_list() noexcept : _First(nullptr),_Last(nullptr) {}
constexpr initializer_list(const _Elem* _First_arg,const _Elem* _Last_arg) noexcept
: _First(_First_arg),_Last(_Last_arg) {}
所以我的第一个问题是:上面标有(*)的行,后面是否有某种语法糖允许使用此语法(或者可能是编译器的常规语法,以便他进行处理并正确设置所有内容) )?
从类的角度看,所有内容都是constexpr,所以我的结论是,它们都是在编译时完成的,但是我找不到关于该问题的任何具体解释。
下一个问题与先前的结论有点矛盾,但是由于我不确定发生的事情100%,所以我还是要问:如果我没有明确使用new initializer_list<int>({...});
,{ {1}}是否曾经以任何方式使用动态内存(是否有某种用例)?
同样,这是一个愚蠢的问题,但是我想确切地了解该类发生了什么,以及它如何与内存发生冲突。
第三个问题是,假设我们有一个类似如下的代码:
initializer_list
在这种情况下,除了#include <iostream>
using namespace std;
class Test
{
public: Test(initializer_list<uint32_t>&& lst)
{
cout << "Size: " << lst.size() << endl;
for (const uint32_t* i = lst.begin(); i != lst.end(); ++i)
{
cout << " " << *i;
}
cout << endl << endl;
}
};
int main(void)
{
Test t1({ 4,6,3 });
Test t2({ 6,3,2,8 });
return 0;
}
和Test
实例使用的方法以外,还有没有其他方法可以使用t1
类的构造函数?当然,这从一开始就正确吗? t2
确实会打印出正确的值,但是我要确保没有任何不正确的格式,例如'brace init list'cout
被销毁(如果说这样的话甚至可能)在{ ... }
使用它们之前?
这让我很烦,因为我对编写此类东西时C ++如何管理内存一无所知。