模糊语法

时间:2010-09-03 12:28:51

标签: c++ ambiguity

#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()在不同的上下文中被区别对待?任何标准参考都会有所帮助。

5 个答案:

答案 0 :(得分:8)

根据上下文,

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

sizeof可以使用表达式或带括号的类型说明符作为其参数,从而产生这种歧义。所以这里MYINT()被解释为类型说明符;然后出现错误,因为sizeof无法应用于函数类型。

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

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

答案 1 :(得分:6)

如果您的MINTINTtypedef 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 typecout << sizeof(MYINT());。问题是()周围MYINT()。 C ++标准说明了sizeof及其解析方式:

sizeof unary-expression
sizeof ( type-id )

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