为什么“vector<int>(v1);”语句失败
Why does the statement “vector<int>(v1);” fail
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的临时副本"。孤立使用时,它看起来像一个复制构造函数,但实际上它声明了一个对象。差值由点运算符给出。
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么“vector<int>(v1);”语句失败
- POCO dev-release v1.5.3编译失败