C++ 为什么不';默认参数是否在版本中完全初始化?(调试与发布)

C++ 为什么不';默认参数是否在版本中完全初始化?(调试与发布),c++,visual-studio-2013,default-parameters,C++,Visual Studio 2013,Default Parameters,只是给我一些背景资料。我是一个经验丰富的C开发人员,转换到C++项目。我在职业生涯中早就做C++了,但是有点生疏了…尽管如此。下面是我能想出的最简单的例子来说明我的问题: #include <vector> #include <iostream> using namespace std; struct Inner { public: float A; unsigned short B; Inner() :A(0.0F)

只是给我一些背景资料。我是一个经验丰富的C开发人员,转换到C++项目。我在职业生涯中早就做C++了,但是有点生疏了…尽管如此。下面是我能想出的最简单的例子来说明我的问题:

#include <vector>
#include <iostream>

using namespace std;

struct Inner
{
public:
    float A;
    unsigned short B;    

    Inner()
        :A(0.0F), B(0)
    {
    }

    Inner(const float& valA, const unsigned short& valB)
        : A(valA), B(valB){}        
};

class Outer
{
private:
    const vector<Inner> CollectionOfInner;

public:
    Outer(const vector<Inner> initialVal = { Inner(1.0F, 4), Inner(9.0F, 4), Inner(81.0F, 18) })
        : CollectionOfInner(initialVal)
    {
        cout << "Values" << '\n';
        for (int i = 0; i < 3; i++)
        {
            cout << "A: " << CollectionOfInner[i].A << " B: " << CollectionOfInner[i].B << '\n';
        }
    }    
};

int main()
{
    Outer test;
}
但是,在版本配置中,只有三个内部实例中的第一个正确初始化,输出如下:

Values
A: 1 B: 4
A: 4.59009e-039 B: 4138
A: 2.64788e-038 B: 52345
Press any key to continue . . .

我确信这与在发行版中启用的一些优化有关。。。但就我的生活而言,我无法想象你为什么会想要这种行为。。。起初我以为在我的大项目中有一些内存浪费,但一旦我用一个非常简单的项目确认了“bug”,我就知道有一些更基本的事情正在发生。注意:如果我向外部构造函数提供一个预先创建的向量,一切都很好。该问题仅在依赖默认构造函数时出现。有什么想法吗?另外,为了参考这一点,VisualStudio 2013使用标准的C++控制台应用程序项目模板来完成。

一致性似乎是VisualStudio 2013中的一个bug。我自己回答这个问题来解决这个问题。谢谢大家

<代码>每个(内部集合的内部值)< /代码>,这不是C++。O.OWORKS在C++ 11中很好:)在测试之后,它在Linux上与GCC和CLAN都完美地结合。如果我没记错的话,VS2013在其初始值设定项列表实现中有一些bug,后来得到了修复,所以这可能是罪魁祸首。我建议确保你有最新的更新(我想是更新4),或者在VS2015预览版上试试。或者尝试在没有初始值设定项列表的情况下执行此操作@RaphaelMiedl是的,他们在初始值设定项列表中有很多错误,以至于Update4回滚了编译器对大括号init列表的大多数使用的支持。在此之前,有很多奇怪的行为,初始化列表中的元素被过早地销毁,这可能是armstrom遇到的情况。@armstrom您的示例在VS2015的发布模式下的行为与预期一样。对于VS2013,您必须想出一个不涉及使用
vector
的初始值设定项列表构造函数的解决方案。您没有共享一个MVCE,因此没有人可以确定这一点。@老实说,MVCE缺少的东西很简单,它只是一个创建虚拟外部对象的主函数。。。我现在把它添加到OP的问题中。@RaphaelMiedl这通常是最后一行,c.f.以前有人犯了奇怪的编译器错误,所有这些错误都是通过
auto-it:…
而不是
auto&it:…
Values
A: 1 B: 4
A: 4.59009e-039 B: 4138
A: 2.64788e-038 B: 52345
Press any key to continue . . .