这可能不是完全有用的答案,但我决定在STD库中vector类声明中设置断点。
回答
在定义向量时,有三种方式处理赋值。结构体将提供值构建,而int将被分配为大小范围构建。
它将std::vector<struct> vect{100};
读作构建长度为100的向量,而std::vector<int> vect{100};
则类似于vect.insert(v.end(),100);
这基于传递给的对象的类型。
为了信息的完整性,最后一种选择是取一个给定的值,并将其分配给许多位置。因此,如果您有100个“x”,它会将“x”放入您的向量中100次。
旅程
我从中学到的是,在您的向量接受size_type输入和_Valty&&输入(我还不知道那是什么。稍后会查找)之间存在一个点,并在3个不同的参数之间提供构造。
我的最佳猜测是,您的结构体填充了1个args路径并充当长度声明,而原生类型的int则落入2个args路径中并充当值分配。
sizeof(Value)可能== 0,而int的大小将为1。
编辑:我猜测了1和2(或_Count == 0和Count == 1),但是我错了。它是_Count == 0和_Count == 2。这非常有趣。
template <class... _Valty>
_CONSTEXPR20 void _Construct_n(_CRT_GUARDOVERFLOW const size_type _Count, _Valty&&... _Val) {
auto& _Al = _Getal();
auto&& _Alproxy = _GET_PROXY_ALLOCATOR(_Alty, _Al);
auto& _My_data = _Mypair._Myval2;
_Container_proxy_ptr<_Alty> _Proxy(_Alproxy, _My_data);
if (_Count != 0) {
_Buy_nonzero(_Count);
_Tidy_guard<vector> _Guard{this};
if constexpr (sizeof...(_Val) == 0) {
_My_data._Mylast = _Uninitialized_value_construct_n(_My_data._Myfirst, _Count, _Al);
} else
if constexpr (sizeof...(_Val) == 1) {
_STL_INTERNAL_STATIC_ASSERT(is_same_v<_Valty..., const _Ty&>);
_My_data._Mylast = _Uninitialized_fill_n(_My_data._Myfirst, _Count, _Val..., _Al);
} else
if constexpr (sizeof...(_Val) == 2) {
_My_data._Mylast = _Uninitialized_copy(_STD forward<_Valty>(_Val)..., _My_data._Myfirst, _Al);
} else {
static_assert(_Always_false<_Ty>, "Should be unreachable");
}
_Guard._Target = nullptr;
}
_Proxy._Release();
}
有趣的是,这似乎发生在分配 Allocator 引用时。虽然我并不是语言方面的专家,但我真的很想解决这个谜题!感谢这个有趣的挑战!
如果您以前从未遍历过类定义,请尝试一下。