9

当我看到这段代码用 MS Visual C++ 编译成功时,我感到很惊讶。

struct foo {
    struct foo(int i): value(i) {}
    int value;
};

struct在这种奇怪的情况下,关键字是什么意思?

4

1 回答 1

10

在大多数情况下,您可以使用详细的类型说明符 struct foo,或者等效地class foo,而不仅仅是类名foo。这对于解决歧义很有用:

struct foo {};  // Declares a type
foo foo;        // Declares a variable with the same name

foo bar;        // Error: "foo" refers to the variable
struct foo bar; // OK: "foo" explicitly refers to the class type

但是,在声明构造函数时不能使用这种形式,因此编译器接受该代码是错误的。构造函数声明的规范(在 C++11 12.1/1 中)只允许类名本身,而不是详细的类型说明符。

通常,当 Visual C++ 编译各种不可靠的代码时,您不应该感到惊讶。它因其对语言的非标准扩展而臭名昭著。

于 2013-07-19T12:55:48.937 回答