VC++ 矢量作为默认参数
VC++ vector as default parameter
我有一个问题,如果以下短代码确实有效:
class Foo {
public:
Foo(std::string param,
const std::vector<std::string>& vec = std::vector<std::string>({ "value 1", "value 2" }))
{}
};
这在 gcc 和 VC++ 2013 中编译时没有警告,但是虽然 gcc 编译的程序运行良好(在 Linux 上),但当应该设置默认参数时,VC++ 编译的程序会因运行时错误而中断。
Foo foo("value"); // breaks
Foo foo("test", std::vector<std::string>({ "value", "value1" })); // runs fine
调用 Foo foo("value")时的错误是:
File: f:ddvctoolscrtcrtw32miscdbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
谁能暗示出了什么问题?
VC2013内部错误。它并不完全与新的C++结构保持同步。
问题出现在调试删除代码中,特别是检查双重删除和删除非堆分配对象的代码。由于相关对象是std::vector
和std::string
,因此大致有四种选择:
std::string
实现中的错误std::vector
实现中的错误- dbgdel 中的错误.cpp在调试模式下检查
delete
的代码 - 默认参数代码中的编译器错误
考虑到这两个测试用例,前三个不太可能。
编辑2:从副本:"initializer_list
行为有问题。在其析构函数中,它调用整个范围的向量删除(delete[]
),然后再次删除数组中的第一个条目)。 initializer_list
是实现的一部分,所以这确实是VS2013中的内部错误。
相关文章:
- 如何使用默认参数等选择模板专业化
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 何时提供默认参数作为模板参数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 函数不接受 X 参数,函数使用默认参数
- initializer_list具有默认参数的构造函数
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 为什么C++构造函数在继承中需要默认参数?
- 必须非常量别名参数及其默认参数常量
- C++ 默认参数使用其他参数
- 组合函数参数包和默认参数
- 如何定义 Vector2f 的默认参数?[SFML]
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 如何设置默认参数以防用户不输入另一个参数
- 结构 c++ 中的默认参数
- 构造函数委托与默认参数
- 默认参数和函数指针作为函数参数C++
- 如何在继承层次结构中调用具有默认参数的构造函数?