我刚刚在使用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)
for
语句的各种变体即可。这将使更改内容更加清晰明了。 - Martin Bonner supports Monicaif(true)
的条件语句,也能够复现。 - A.S.H