vector.assign() 按顺序取值

vector.assign() with value in sequence

下面的定义是否明确?

std::vector<std::string> v{"test"};
v.assign(1, v.at(0));

如果旧序列在构建新序列之前被销毁 传递给 assign 的引用将失效,因此 程序格式不正确。

标准中是否提到了这种情况( 价值是旧序列的一部分)或任何地方类似的东西, 使这个结构合式?我找不到任何东西。

来自 Dinkumware 标准库实现的副本 使用 VS2010(_Assign_nassign 内部调用的内容):

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)