m_integer==12345); assert(structures.begin()->m_string==“foobar”);//这里是abort()。 返回退出成功; },c++,c++11,visual-studio-2013,language-lawyer,msvc12,C++,C++11,Visual Studio 2013,Language Lawyer,Msvc12" /> m_integer==12345); assert(structures.begin()->m_string==“foobar”);//这里是abort()。 返回退出成功; },c++,c++11,visual-studio-2013,language-lawyer,msvc12,C++,C++11,Visual Studio 2013,Language Lawyer,Msvc12" />

MSVC 12 std::initializer\u复制std::string时列出错误 我试图用MSVC 12(VisualStudio 2013,更新4)创建一个C++程序,它使用了 STD::IngalIZErrIListList,这些结构有 STD::String 成员。我似乎在MSVC中遇到了一个bug。下面是一个显示问题的最小示例: #include <cassert> #include <initializer_list> #include <string> namespace { struct TestStructure { std::string m_string; int m_integer; TestStructure(const std::string& string, int integer) : m_string(string), m_integer(integer) { } TestStructure(const TestStructure&) = default; ~TestStructure() = default; TestStructure& operator=(const TestStructure&) = default; }; } int main(int, char **) { TestStructure structure("foobar", 12345); std::initializer_list<TestStructure> structures({structure}); assert(structure.m_integer == 12345); assert(structure.m_string == "foobar"); assert(structures.size() == 1); assert(structures.begin()->m_integer == 12345); assert(structures.begin()->m_string == "foobar"); // abort()'s here. return EXIT_SUCCESS; } #包括 #包括 #包括 名称空间 { 结构测试结构 { std::string m_string; 整数; TestStructure(const std::string&string,int integer) :m_字符串(字符串),m_整数(整数) { } TestStructure(const TestStructure&)=默认值; ~TestStructure()=默认值; TestStructure&运算符=(const TestStructure&)=默认值; }; } int main(int,char**) { 测试结构(“foobar”,12345); std::初始值设定项\列表结构({structure}); 断言(structure.m_integer==12345); 断言(structure.m_string==“foobar”); 断言(structures.size()==1); 断言(structures.begin()->m_integer==12345); assert(structures.begin()->m_string==“foobar”);//这里是abort()。 返回退出成功; }

MSVC 12 std::initializer\u复制std::string时列出错误 我试图用MSVC 12(VisualStudio 2013,更新4)创建一个C++程序,它使用了 STD::IngalIZErrIListList,这些结构有 STD::String 成员。我似乎在MSVC中遇到了一个bug。下面是一个显示问题的最小示例: #include <cassert> #include <initializer_list> #include <string> namespace { struct TestStructure { std::string m_string; int m_integer; TestStructure(const std::string& string, int integer) : m_string(string), m_integer(integer) { } TestStructure(const TestStructure&) = default; ~TestStructure() = default; TestStructure& operator=(const TestStructure&) = default; }; } int main(int, char **) { TestStructure structure("foobar", 12345); std::initializer_list<TestStructure> structures({structure}); assert(structure.m_integer == 12345); assert(structure.m_string == "foobar"); assert(structures.size() == 1); assert(structures.begin()->m_integer == 12345); assert(structures.begin()->m_string == "foobar"); // abort()'s here. return EXIT_SUCCESS; } #包括 #包括 #包括 名称空间 { 结构测试结构 { std::string m_string; 整数; TestStructure(const std::string&string,int integer) :m_字符串(字符串),m_整数(整数) { } TestStructure(const TestStructure&)=默认值; ~TestStructure()=默认值; TestStructure&运算符=(const TestStructure&)=默认值; }; } int main(int,char**) { 测试结构(“foobar”,12345); std::初始值设定项\列表结构({structure}); 断言(structure.m_integer==12345); 断言(structure.m_string==“foobar”); 断言(structures.size()==1); 断言(structures.begin()->m_integer==12345); assert(structures.begin()->m_string==“foobar”);//这里是abort()。 返回退出成功; },c++,c++11,visual-studio-2013,language-lawyer,msvc12,C++,C++11,Visual Studio 2013,Language Lawyer,Msvc12,我希望这个程序编译和执行时不会出现任何问题。然而,当我运行它时,最后一个断言似乎失败了。在VisualStudio调试器中,似乎structures.begin()->m_string==“” 我的程序是不是形式不好,或者这实际上是MSVC中的一个bug?是否有解决此问题的方法(除了不使用初始值设定项列表)?问题在于您同时使用括号和大括号: std::initializer_list<TestStructure> structures({structure});

我希望这个程序编译和执行时不会出现任何问题。然而,当我运行它时,最后一个断言似乎失败了。在VisualStudio调试器中,似乎
structures.begin()->m_string==“”


我的程序是不是形式不好,或者这实际上是MSVC中的一个bug?是否有解决此问题的方法(除了不使用初始值设定项列表)?

问题在于您同时使用括号和大括号:

std::initializer_list<TestStructure> structures({structure});
                                               ^^         ^^
否则,请使用直接列表初始化(直接使用大括号):

std::初始值设定项\列表结构{structure};

问题是您同时使用了括号和大括号:

std::initializer_list<TestStructure> structures({structure});
                                               ^^         ^^
否则,请使用直接列表初始化(直接使用大括号):

std::初始值设定项\列表结构{structure};

这个问题似乎与以下事实有关:
std::initializer\u list
的构造函数正在分配一个内部指针,指向我用
{structure}
语法创建的临时对象。我想知道根据C++11标准,这是否是预期的行为,或者我正在做的事情是否应该像预期的那样工作(制作一个副本)?这个问题似乎与以下事实有关:
std::initializer\u list
的构造函数正在分配一个内部指针,指向我用
{structure}创建的临时对象
语法。我想知道根据C++11标准,这是否是预期的行为,或者我正在做的事情是否应该像预期的那样工作(复制)?
std::initializer_list<TestStructure> structures{structure};