繁体   English   中英

语法不明确

[英]Ambiguous Syntax

#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()表达式进行不同的处理? 任何标准参考都将有所帮助。

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

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

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

cout << MYINT()是明确的,因此应该没有错误,并且实际上我的编译器没有错误。 错误是什么,您的编译器是什么?

如果您的MINTINTtypedef int MYINTMYINT()不是函数,而是int() ,这是默认的初始化,等效于int y = 0int y = int(0)

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

但是g++会抱怨sizeof并出现以下错误error: invalid application of "sizeof" to a function type因为它将MYINT()解释为“对int的默认构造函数的调用”( 编辑 :这是不正确的)“函数类型返回不允许的MYINT”( 编辑 :这是正确的答案,请参阅Mike的答案)。 但这与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>

Edit Look也是Mike Seymour的答案,以解释sizeof的歧义。

// 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);  

为什么在主函数中,右括号前的最后两行给出错误?

cout << MYINT(); 不起作用,因为未定义cout 一旦执行#include <iostream>using std::cout ,它将正常工作。

sizeof(MYINT())确实不起作用,但是sizeof(int())也不起作用,所以这是可以预期的。 sizeof(MYINT)可以正常工作。

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

不是。 在每种情况下, MYINT()行为都与int()完全相同。

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

sizeof unary-expression
sizeof ( type-id )

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM