奇怪的编译器错误

5

我刚刚在使用msvc时遇到了这个小错误。在我看来,这似乎是一个解析问题,但我不确定。
下面的代码导致了C2143 语法错误:在“}”之前缺少“;”

#include <vector>

struct X { };

X f(const std::vector<int> v)
{
  for (auto i : v)
    if (true)
      return X{};     // <--

  return X{};
}

int main()
{
  const auto x = f(std::vector<int>{});
}

以下4种变体编译都没有问题。但是,这个:
X f(const std::vector<int> v)
{
  for (auto i : v)
    if (true)
      return X();     // <--

  return X{};
}

并且这个

X f(const std::vector<int> v)
{
  for (auto i : v)
    if (true) {       // <--
      return X{};     // <--
    }                 // <--
  return X{};
}

并且这个

X f(const std::vector<int> v)
{
  for (auto i : v) {  // <--
    if (true)
      return X{};     // <--
  }                   // <--
  return X{};
}

并且这个

X f(const std::vector<int> v)
{
  //for (auto i : v)  // <--
    if (true)
      return X{};     // <--

  return X{};
}

抱歉,这里有一堆令人困惑的代码。

我是不是漏掉了某些神秘的规则?或者这是编译器的bug?

使用Visual Studio 2015 (v140) Express Edition进行桌面开发
已以x64模式编译,在debug和release模式下都一样
所有编译器选项均为默认选项(除了将警告级别提升到W4)


1
你使用的是哪个版本的VS? - user657267
1
它在gcc中不会失败(当然要加上-std=c++11选项)。因此,这一定是编译器的错误。 - ABu
2
“代码墙”:顶部的完整 [mcve] 得满分,但我建议您只需展示 for 语句的各种变体即可。这将使更改内容更加清晰明了。 - Martin Bonner supports Monica
谢谢,马丁。我已经稍微简化了代码。 - Garp
即使没有 if(true) 的条件语句,也能够复现。 - A.S.H
显示剩余2条评论
1个回答

4

我认为这是一个编译器的 bug。我可以在rextester.com 上重现你的错误,但在 webcompiler.cloudapp.net 上,代码可以编译通过(那儿的 Visual C++ 编译器版本为 19.10.24807.0 (x86))。

同时,最新版本的gccclang 都能够编译这段代码。

该语法本身是完全有效的。


谢谢你,埃德加。很高兴知道问题不在代码中。 - Garp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接