VC ++向量作为默认参数

时间:2014-12-09 15:31:09

标签: c++ visual-c++ c++11

如果以下短代码实际有效,我有一个问题:

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编译的程序aslo运行正常(在Linux上)时,VC ++编译的程序会在设置默认参数时因运行时错误而中断。

Foo foo("value"); // breaks
Foo foo("test", std::vector<std::string>({ "value", "value1" })); // runs fine

调用 Foo foo时出错(&#34;值&#34;); 是:

File: f:\dd\vctools\crt\crtw32\misc\dbgdel.cpp
Line: 52

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

任何人都可以暗示出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

VC2013内部bug。它与新的C ++结构并不完全一致。

问题出现在调试删除代码中,特别是检查双重删除和删除非堆分配对象的代码。由于相关对象为std::vectorstd::string,因此大致有四种选择:

  1. std::string实施中的错误
  2. std::vector实施中的错误
  3. 在调试模式下检查delete的dbgdel.cpp代码中的错误
  4. 默认参数代码中的编译器错误
  5. 考虑到两个测试用例,前三个不太可能。

    Edit2:来自副本:“initializer_list行为是错误的。在它的析构函数中,它调用整个范围的向量删除(delete[]),然后再次删除数组中的第一个条目)“。 initializer_list是实现的一部分,因此这确实是VS2013中的内部错误。