C++ 写“return{data,uninitialized_copy(b,e,data)}”是未定义的行为吗在C++;

C++ 写“return{data,uninitialized_copy(b,e,data)}”是未定义的行为吗在C++;,c++,c++11,c++14,undefined-behavior,C++,C++11,C++14,Undefined Behavior,您好,我正在阅读一个例子,说明如何在不使用其中一本书中的模板的情况下定义我们自己的类向量。现在有一个函数定义如下: pair<string *, string*> StrVec::alloc_n_copy(const string *b, const string *e) { auto data = alloc.allocate(e - b); return {data, uninitialized_copy(b, e, data)}; } pair StrVec::

您好,我正在阅读一个例子,说明如何在不使用其中一本书中的模板的情况下定义我们自己的类向量。现在有一个函数定义如下:

pair<string *, string*> StrVec::alloc_n_copy(const string *b, const string *e)
{
   auto data = alloc.allocate(e - b);
   return {data, uninitialized_copy(b, e, data)};

}
pair StrVec::alloc_n_copy(常量字符串*b,常量字符串*e)
{
自动数据=分配分配(e-b);
返回{data,未初始化的_copy(b,e,data)};
}
现在我的问题是,上面的返回语句是未定义的行为吗?例如,我知道以下语句是未定义的行为:

std::cout<< i << ++i<<std::endl;
你说得对

std::cout<< i << ++i<<std::endl;
不更改
数据
。它只会更改
数据
指向的元素。

你说得对

std::cout<< i << ++i<<std::endl;


不更改
数据
。它只更改元素
数据
指向。

std::cout的问题
std::cout的问题是什么
uninitialized\u copy
?@maximust\u prime\u是\u 463035818它应该定义什么?它确实会更改数据指针指向的值,但不会更改数据变量本身,因此它是正常的。您不能仅仅通过语法中的相似性来得出定义/未定义行为的结论
std::cout什么是
uninitialized\u copy
?@maximust\u prime\u是\u 463035818可能应该定义什么?它确实会更改数据指针指向的值,但不会更改数据变量本身,因此它是正常的。您不能仅仅通过语法中的相似性来得出定义/未定义行为的结论。此外,
{…}
具有序列点(以及从左到右的求值)@churill我们也在按值传递
数据
,因此将给出
数据
的副本,这意味着当
数据
增加时,将增加的是临时副本,而不是原始副本。谢谢。此外,
{…}
还有序列点(以及从左到右的求值)。@churill我们也在按值传递
数据,因此将给出
数据的副本,这意味着当
数据
增加时,将是临时副本,而不是原始副本。谢谢,我知道你的例子。我的下一个问题是当我们使用未初始化的拷贝()时,比如说
未初始化的拷贝(vec.begin(),vec.end(),data)
那么迭代器
数据
的增量不是与输入范围中的元素的增量相同吗?例如,如果输入范围中有4个元素,那么数据将增加4倍以指向这些位置,以便可以在那里构造元素。所以,增加
数据
不是意味着改变
数据
?还是不是这样,因为数据是按值传递的?@JasonLiam
d_first
是按值传递的。在未初始化的拷贝中发生的事情是另一回事,我必须承认,我并不真正理解它的作用,严格来说没有必要回答这个问题,我得到了你的例子。我的下一个问题是当我们使用未初始化的拷贝()时,比如说
未初始化的拷贝(vec.begin(),vec.end(),data)
那么迭代器
数据
的增量不是与输入范围中的元素的增量相同吗?例如,如果输入范围中有4个元素,那么数据将增加4倍以指向这些位置,以便可以在那里构造元素。所以,增加
数据
不是意味着改变
数据
?还是不是这样,因为数据是按值传递的?@JasonLiam
d_first
是按值传递的。在未初始化的拷贝中发生的事情是另一回事,我必须承认我并不真正理解它的作用,严格来说没有必要回答这个问题
return {data, uninitialized_copy(b, e, data)};
template< class InputIt, class ForwardIt >
ForwardIt uninitialized_copy( InputIt first, InputIt last, ForwardIt d_first );
 int foo(int x) { return 2*x; }

 int bar(int y)  { return y + foo(y); }