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)
,这是什么意思?
答案 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
答案 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; 。在隔离中使用,它看起来像一个复制构造函数,但实际上它声明了一个对象。差异由点运算符给出。