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

时间:2016-04-01 15:32:34

标签: c++ vector

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

“C ++编码标准:101规则,指南和最佳实践”一书中,第82章“使用公认的习语来真正缩小容量并真正擦除元素”。有声明:

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

  

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

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

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

See live demo for the latter

1) @Sergey A&#39; answer被盗,但他更愿意将其删除

答案 2 :(得分:1)

我理解vector<int>(v1)是违反直觉的,但我没有看到使用它的意义。正如其他人所指出的,这是标准行为。如果您正在寻找解决方案,这里有2个解决方法:

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

编辑(问题已更改):&#34; container<_Type>(c).swap(c);我不明白......&#34; 这与container<_Type>(c);。容器的容量可能大于size报告的容量(请参阅reserve)。该储备有助于减少一些操作的数量。如果添加新元素,容器将使用已分配的内存。例如,你的矢量可能有10个元素的空间,但它实际上只有1.如果添加一个新元素,则剩下8个元素的空间。上面的构造删除了保留以节省内存。首先是原件的副本(此副本没有保留)。然后,原始向量的基础数据(指针)被新的替换(参见swap),并且临时对象(现在拥有原始内存)将被丢弃。

&#34; ...要测试container<_Type>(c),它是什么意思?&#34; 如上所述,它意味着&#34;创建一个临时副本c&#34; 。在隔离中使用,它看起来像一个复制构造函数,但实际上它声明了一个对象。差异由点运算符给出。