一个vector<int>(v1)表达式产生一个临时对象,并且可以在右侧放operator=,但如果我们用一个vector<int>(v1)表达式作为一个声明,它会在Visual Studio 2010 10.0.30319.1 RTMRel失败.详细错误信息位于以下代码的注释中.为什么会这样?
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
Run Code Online (Sandbox Code Playgroud)
在"C++编码标准:101规则,指南和最佳实践"一书中,第82章"使用公认的习语真正缩小容量并真正擦除元素".有一个声明:
container<_Type>(c).swap(c);
Run Code Online (Sandbox Code Playgroud)
我不明白,只想测试container<_Type>(c),这是什么意思?
我知道这vector<int>(v1)是违反直觉的,但我不明白使用它的意义。正如其他人指出的那样,这是标准行为。如果您正在寻找解决方案,这里有 2 个解决方法:
vector<int>::vector( v1 );\nvector<int> { v1 };\nRun Code Online (Sandbox Code Playgroud)\n\n编辑(问题已更改):“container<_Type>(c).swap(c);我不\xe2\x80\x99t 理解...”这与container<_Type>(c);. 容器的容量可能大于报告的容量size(请参阅reserve)。该储备有助于最大限度地减少某些操作的数量。如果添加新元素,容器将使用已分配的内存。例如,您的向量可能有容纳 10 个元素的空间,但实际上只有 1 个。如果添加新元素,则剩下 8 个元素的空间。上述构造删除了保留以节省内存。首先制作原件的副本(此副本没有保留)。然后,原始向量的基础数据(指针)被swap新向量替换(参见 ),并且临时对象(现在拥有原始向量的内存)被丢弃。
“……测试container<_Type>(c),这是什么意思?” 如上所示,它的意思是“创建 c 的临时副本”。单独使用时,它看起来像一个复制构造函数,但实际上它声明了一个对象。差异由点运算符给出。