1
#include <iostream>
using namespace std;

typedef int MYINT;

int main() 
{ 
    int y = MYINT();                     // As expected, y = 0; value initialization
    cout << MYINT();                     // Error
    cout << sizeof(MYINT());             // Error
} 

为什么右大括号之前的主函数中的最后两行会出错?为什么在不同的上下文中对表达式 MYINT() 的处理方式不同?任何标准参考都会有所帮助。

4

5 回答 5

8

MYINT()根据上下文,可以解释为 type 的表达式MYINT,或不带参数并返回的函数类型的说明符MYINT。在某些情况下,表达式或类型说明符有效,这会产生歧义;如果可能,可以通过将其解释为类型说明符来解决此问题(编辑:C++03 8.2/2,如果您想要标准参考)。

sizeof可以将表达式或带括号的类型说明符作为参数,从而产生这种歧义。所以这里MYINT()被解释为类型说明符;那么你会得到一个错误,因为sizeof不能应用于函数类型。

编辑:您可以通过删除括号来修复错误,以便将其解释为表达式 ( sizeof MYINT()),添加额外的括号使其不是有效的类型说明符 ( sizeof((MYINT()))),或将其更改为正确的类型 ( sizeof(MYINT))。

cout << MYINT()是明确的,所以应该没有错误,而且我的编译器确实没有。什么是错误,你的编译器是什么?

于 2010-09-03T12:45:29.017 回答
6

如果你的MINTINTis typedef int MYINTthenMYINT()不是一个函数,而是int()一个默认初始化,相当于int y = 0or int y = int(0)

您的第二行,即出于同样的原因cout << MYINT()为我正确编译。g++ -Wall -ansi -pedantic

但是g++会抱怨sizeof以下错误error: invalid application of "sizeof" to a function type,因为它解释MYINT()为“调用 int 的默认构造函数”(编辑:这是不正确的)“返回不允许的 MYINT 的函数类型”(编辑:这是正确的答案,见迈克的)。但这与typedef.

概括:

#include <iostream>
typedef int myint;
int main()
{
int y = myint();
int z = myint(0);
std::cout << y << z; // Will output 0 0
std::cout << std::endl << myint(0) << myint(); // Will output 0 0
std::cout << sizeof(int()); // The error is here; same with sizeof(myint())
}

编辑(再次)

正如评论中所说,这些cout行对你不起作用,这是因为你可能忘记了include <iostream>.

编辑 查看 Mike Seymour 的答案,以解释与sizeof.

于 2010-09-03T12:34:33.140 回答
3
// OK. Implicit conversion to int.
int y = MYINT();          

// OK. Implicit conversion again. Which compiler do you use?
cout << MYINT();          

// Invalid. Tries to get size of a function that returns MYINT,
// because sizeof expects a type-id and according to 8.2/2,
// which is forbidden according to the C++ Standard 5.3.3/1
cout << sizeof(MYINT());  
// Do you want this instead?
cout << sizeof(MYINT);  
于 2010-09-03T12:36:44.737 回答
2

为什么右大括号之前的主函数中的最后两行会出错?

cout << MYINT();不起作用,因为cout未定义。一旦你这样做#include <iostream>using std::cout它就会正常工作。

sizeof(MYINT())确实不起作用,但sizeof(int())也不起作用,所以这是可以预料的。sizeof(MYINT)会工作得很好。

为什么在不同的上下文中对表达式 MYINT() 的处理方式不同?

它不是。在每种情况下,MYINT()其行为都与int().

于 2010-09-03T12:36:13.907 回答
2

我没有看到该cout << MYINT();行有任何错误。但是我看到invalid application of 'sizeof' to a function type了这cout << sizeof(MYINT());条线。问题是()周围MYINT()。C++ 标准说明sizeof了这一点及其解析方式:

sizeof unary-expression
sizeof ( type-id )

sizeof unary-expression和之间存在解析歧义sizeof ( type-id )。它通过使用更长的匹配来解决。它解析sizeof (MYINT())sizeof ( type-id ),MYINT()是一个函数类型,因此您会看到错误。

于 2010-09-03T13:07:20.633 回答