【问题标题】:Is this a MSVC++ compiler bug?这是一个 MSVC++ 编译器错误吗?
【发布时间】:2014-01-26 16:28:25
【问题描述】:

我想我可能在 VS2013 附带的 MSVC++ 编译器中发现了一个编译器错误,但这是一个简单的案例,我无法确定。再加上我还在学习 C++,我想在提交任何内容之前先在这里问一下;因为老实说,我很确定这只是我做错了导致不寻常的错误消息。

无论如何,我将问题简化为一个小测试文件:

#include <string>
#include <iostream>

std::wstring cstr_to_wstring(const char* cString) {
    std::string temp = cString;
    return { temp.begin(), temp.end() };
}

int main() {
    std::cout << cstr_to_wstring("Hi").c_str();
}

当我尝试编译它时,我收到以下错误:

1>d:\documents\projects\compilerbugtest\compilerbugtest\compilerbugtest.cpp(6): fatal error C1001: An internal error has occurred in the compiler.
1>  (compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 227)
1>   To work around this problem, try simplifying or changing the program near the locations listed above.

要解决这个问题,我可以在第六行指定类型,这样:

return { temp.begin(), temp.end() };

变成

return std::wstring { temp.begin(), temp.end() };.

这真的是编译器错误吗?谢谢。

【问题讨论】:

  • 我想说An internal error in the compiler 总是值得报告,无论使用何种源代码。
  • 当编译器声明这是一个编译器错误时,那么它就是编译器中的一个错误,或者说它是一个错误,它是编译器中的一个错误。在这两种情况下,它都是一个编译器错误 :-)
  • 哈哈,好点子,GSerg 和 Torsten... :)
  • 您的代码使用g++ (Debian 4.8.2-14) 4.8.2 成功编译。然而,当c_str() 返回const wchar_t * 时,cout 以十六进制打印地址值。
  • @nodakai 嗯,就像我说的,我真的是一个 C++ 菜鸟,哈哈。我刚刚使用了我发现的第一个可以编译的函数:)

标签: c++ visual-c++ visual-studio-2013


【解决方案1】:

是的,这是编译器中的一个错误。所有编译器崩溃都是编译器错误,无论代码是否格式正确。 11 月在 Microsoft Connect 上报告了此特定错误:

Internal compiler error with std::map operations and braces in return statement.

在该错误中,Xiang 报告说我们已在编译器的下一个主要版本中修复了此问题(我已验证您的代码使用最新的内部构建进行编译)。同时,推荐的解决方法是执行您已完成的操作并在 return 语句中命名类型。

【讨论】:

  • 嗨,詹姆斯,感谢您的回复。 :) 在离开这里的 cmets 鼓励我之后,我已经在 MS Connect 上提出了一个错误;所以我想它应该被标记为重复。 connect.microsoft.com/VisualStudio/feedback/details/814718/…
  • 谢谢。我们将它作为重复来解决。多次报告错误总比不报告要好。 :-)
  • 我正在阅读 connect.microsoft.com/VisualStudio/feedback/details/808852/…,它应该已修复,但我仍然遇到同样的问题。
  • @MiguelAngel 我刚刚验证了原始问题中的程序可以使用 Visual C++ 2015 成功编译。您是否有类似的程序无法使用 Visual C++ 2015 成功编译?如果是这样,请在 Microsoft Connect 上打开一个新错误。
  • @JamesMcNellis 我正在尝试完全相同的程序。我正在更新VS2013到更新5,如果更新后错误仍然存​​在,我会发送报告。谢谢!