vector.assign() 按顺序取值
vector.assign() with value in sequence
下面的定义是否明确?
std::vector<std::string> v{"test"};
v.assign(1, v.at(0));
如果旧序列在构建新序列之前被销毁
传递给 assign
的引用将失效,因此
程序格式不正确。
标准中是否提到了这种情况(
价值是旧序列的一部分)或任何地方类似的东西,
使这个结构合式?我找不到任何东西。
来自 Dinkumware 标准库实现的副本
使用 VS2010(_Assign_n
是 assign
内部调用的内容):
void _Assign_n(size_type _Count, const _Ty& _Val)
{ // assign _Count * _Val
_Ty _Tmp = _Val; // in case _Val is in sequence
erase(begin(), end());
insert(begin(), _Count, _Tmp);
}
评论
in case _Val is in sequence
表明要么
标准明确规定分配一个元素是
当前序列格式正确,或者 Dinkumware 的实现
只是想变得聪明 ;)
是哪一个?
at()
returns 对容器中现有值的引用。因此,这是未定义的行为。
您只需复制它就可以实现这种定义明确的行为:
v.assign(1, (std::string)v.at(0));
这是未定义的行为,复制的元素不能来自容器本身。
[sequence.reqmts] table 84(草案 n4606)
下面的定义是否明确?
std::vector<std::string> v{"test"};
v.assign(1, v.at(0));
如果旧序列在构建新序列之前被销毁
传递给 assign
的引用将失效,因此
程序格式不正确。
标准中是否提到了这种情况( 价值是旧序列的一部分)或任何地方类似的东西, 使这个结构合式?我找不到任何东西。
来自 Dinkumware 标准库实现的副本
使用 VS2010(_Assign_n
是 assign
内部调用的内容):
void _Assign_n(size_type _Count, const _Ty& _Val)
{ // assign _Count * _Val
_Ty _Tmp = _Val; // in case _Val is in sequence
erase(begin(), end());
insert(begin(), _Count, _Tmp);
}
评论
in case _Val is in sequence
表明要么 标准明确规定分配一个元素是 当前序列格式正确,或者 Dinkumware 的实现 只是想变得聪明 ;)
是哪一个?
at()
returns 对容器中现有值的引用。因此,这是未定义的行为。
您只需复制它就可以实现这种定义明确的行为:
v.assign(1, (std::string)v.at(0));
这是未定义的行为,复制的元素不能来自容器本身。
[sequence.reqmts] table 84(草案 n4606)