在调用静态函数时(意外地)两次指定类名是否合法?

时间:2015-09-18 14:16:40

标签: c++ c++11 visual-studio-2012 gcc clang

我的同事刚刚通过一个新平台的新编译器来运行我们的代码库,毫不奇怪,之前没有报告过错误。

其中一个涉及原始作者在调用该类的静态函数时偶然输入两次类名的代码。看起来像这样:

class Thing
{
public:
    static void DoStuff ();
};

int main (int, char **)
{
    Thing::Thing::DoStuff();
    // or even: Thing::Thing::Thing::Thing::Thing::Thing::DoStuff();
    return 0;
}

我的本​​地(Cygwin)机器上的GCC 4.9.2编译得很好,即使用-Wall -Wextra -Wpedantic也是如此。我们用于嵌入式系统的定制Clang也接受它。 Visual Studio 2012(v110)给出了错误:

error C3083: '{ctor}': the symbol to the left of a '::' must be a type

我可以想象同样有说服力的论据:

  1. 这是合法的,编译器接受它。 (即。 GCC和Clang是正确的,VS是错的)
  2. 这不合法,但编译器可能会接受它。
  3. 这是合法的,但编译器不接受它。 (即。 VS错了;也许这是一个尚未添加的新C ++ 11东西?)
  4. 这不合法,编译器不应接受它。 (即。 Visual Studio是唯一正确的)
  5. 只需修正错误,继续我的生活。
  6. 哪一个是正确的?

0 个答案:

没有答案