默认参数中的细微语法错误未被编译器捕获

Dou*_*dek 5 c++ visual-studio-2008 visual-studio

我开始得到错误,"错误C2059:语法错误:'默认参数'"用于一行代码,该代码行声明了一个带有字符串参数的函数,该函数被赋予了一个默认参数.这显然有点令人沮丧,因为错误信息并不完全具有启发性(我知道这是一个'默认参数'!),而确切的声明在其他地方也可以.

在稍微改变一下声明之后,我发现它在包含类中的位置实际上有效.缩小它,我发现我通过在默认参数之一后加一个分号来错误地声明一个不同的函数.编译器似乎很好,这看起来有点奇怪.我调查了一下,并提出了以下测试用例,试图找出正在发生的事情的本质:

enum TestEnum1
{
   TEST_ONE
};
class TestClass
{
public:
   enum TestEnum2
   {
      TEST_TWO,
      TEST_THREE,
      TEST_FOUR
   };
   void Func1( int iParm = TEST_ONE; ); // additional semicolon here
   void Func2( std::string strParm = "" );
};
Run Code Online (Sandbox Code Playgroud)

如上面的代码所示,Func2将产生我上面提到的编译错误.如果我将Func2移到Func1之上,那么一切都编译得很好.

如果我将Func1中的默认参数切换为显式数字或使用在TestClass中声明的枚举,那么我会得到该行的预期语法错误.

基本上,奇怪的是,如果我将默认参数的值设置为未在当前类中直接定义的枚举,并且有点过于分号,编译器将忽略语法错误,直到其他一些看似无关的最终导致解析器以非常难以理解的方式死亡.

我完全错过了什么吗?这是预期的行为吗?我当然犹豫不决地把它称为​​编译器中的错误,但这似乎不太正确.如果只是我误解了标准的某些内容,那么我想知道我错在哪里.

Han*_*ant 1

同意@tlayton。我自己涉足过一些解析器,我可以证明,为混淆解析器范围感的语法错误生成良好的错误消息可能非常困难。

然而,这个特殊情况接近于缺陷。讽刺的是,在 VS2010 中,编译器仍然生成同样糟糕的错误消息,但 IntelliSense 解析器实际上捕获了它:

3   IntelliSense: expected a ')'    c:\projects\cpptemp14\cpptemp14.cpp 20  36  cpptemp14
Run Code Online (Sandbox Code Playgroud)

那就无聊了。您可以在 connect.microsoft.com 上报告该问题。如果您不想花时间,请告诉我,我会报告(MVP 职责)。