#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()在不同的上下文中被区别对待?任何标准参考都会有所帮助。
答案 0 :(得分:8)
MYINT()
可以被解释为类型MYINT
的表达式,或者不带参数并返回MYINT
的函数类型的说明符。
在某些情况下,表达式或类型说明符有效,这会产生歧义;如果可能的话,通过将其解释为类型说明符来解决这个问题(编辑:C ++ 03 8.2 / 2,如果你想要标准参考)。
sizeof
可以使用表达式或带括号的类型说明符作为其参数,从而产生这种歧义。所以这里MYINT()
被解释为类型说明符;然后出现错误,因为sizeof
无法应用于函数类型。
编辑:您可以通过删除括号来修复错误,以便将其解释为表达式(sizeof MYINT()
),添加额外的括号,使其不是有效的类型说明符( sizeof((MYINT()))
),或将其更改为正确的类型(sizeof(MYINT)
)。
cout << MYINT()
是明确的,所以应该没有错误,实际上我的编译器没有。什么是错误,你的编译器是什么?
答案 1 :(得分:6)
如果您的MINTINT
为typedef int MYINT
,则MYINT()
不是函数,而是int()
,这是默认初始化,与int y = 0
或{{1等效}}
出于同样的原因,您的第二行,即int y = int(0)
正好为cout << MYINT()
编译。
但是g++ -Wall -ansi -pedantic
会抱怨g++
出现以下错误sizeof
,因为它会将error: invalid application of "sizeof" to a function type
解释为“调用int的默认构造函数”(编辑:这是不对的)“一个不允许返回MYINT的函数类型”(编辑:这是正确的答案,请参阅迈克的)。但这与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
。
修改强>
另请参阅Mike Seymour的答案,以解释include <iostream>
的含糊不清。
答案 2 :(得分: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);
答案 3 :(得分:2)
为什么关闭括号前主函数中的最后两行会出错?
cout << MYINT();
不起作用,因为未定义cout
。完成#include <iostream>
和using std::cout
后,它会正常工作。
sizeof(MYINT())
确实不起作用,但sizeof(int())
也不起作用,所以这是可以预料的。 sizeof(MYINT)
可以正常使用。
为什么表达式MYINT()在不同的上下文中被区别对待?
不是。在每种情况下,MYINT()
的行为都与int()
完全相同。
答案 4 :(得分: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()
是一种函数类型,因此您会看到错误。