为什么“vector<int>(v1);”语句失败

Why does the statement “vector<int>(v1);” fail

本文关键字:v1 失败 语句 int vector lt 为什么 gt      更新时间:2023-10-16

vector<int>(v1)表达式生成一个临时对象,可以放在operator=的右侧,但如果我们使用vector<int>(v1)表达式作为语句,它将在Visual Studio 2010 10.0.0319.1RTMRel中失败。详细的错误信息在以下代码的注释中。为什么会发生这种情况?

vector<int> v1; 
v1.push_back( 10 );
v1.push_back( 20 );
v1.push_back( 30 );    
vector<int> v3 = vector<int>(v1);  //OK, deliberately code like this.
vector<int>(v1);  //error C2086: “std::vector<_Ty> v1”: redefinition

在《C++编码标准:101规则、指南和最佳实践》一书中,第82章"使用公认的习语来真正缩小容量并真正擦除元素"。有一种说法:

container<_Type>(c).swap(c);

我不明白,只是想测试container<_Type>(c),这是什么意思?

vector<int>(v1);vector<int> v1;相同。即变量重新定义。

vector<int>(v1)表达式产生一个临时对象,可以放在operator=的右侧,但如果我们使用vector<int>(v1)表达式作为语句,我们将失败。。。

编译器对普通语句的处理方式不同:

vector<int>(v1); //error C2086: “std::vector<_Ty> v1”: redefinition

是编写的另一种方式

vector<int> v1;

因此,您正在重新定义v1,编译器会抱怨。


要查看您的临时初始化工作,请使用例如

void foo(const std::vector<int>& v)
{
}

并呼叫

foo(vector<int>(v1));

或者简单地1

(std::vector<int>)(v1); // this creates a temporary which is immediately disposed

查看后者的实时演示


1)从@Sergey A的答案中窃取,但他更喜欢删除它

我知道vector<int>(v1)违反直觉,但我不认为使用它有什么意义。正如其他人所指出的,这是标准行为。如果你正在寻找解决方案,这里有两个解决方案:

vector<int>::vector( v1 );
vector<int> { v1 };

编辑(问题已更改):"container<_Type>(c).swap(c);我不明白…"这与container<_Type>(c);不同。容器的容量可能大于通过size报告的容量(参见reserve)。保留有助于将某些操作的数量降至最低。如果添加新元素,容器将使用已分配的内存。例如,向量可能有容纳10个元素的空间,但实际上只有1个。如果添加一个新元素,则可容纳8个图元。为了节省内存,上面的构造删除了保留。首先制作一份原件的复印件(此复印件无保留)。然后,原始向量的底层数据(指针)被新的数据替换(参见swap),并且临时对象(现在拥有原始向量的内存)被丢弃。

"…要测试container<_Type>(c),它是什么意思?"如上所述,它的意思是"创建c的临时副本"。孤立使用时,它看起来像一个复制构造函数,但实际上它声明了一个对象。差值由点运算符给出。