[英]Understanding 'most vexing parse' - why allow ambiguous syntax?
[英]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()
是明确的,因此应该没有错误,并且实际上我的编译器没有错误。 错误是什么,您的编译器是什么?
如果您的MINTINT
是typedef int MYINT
则MYINT()
不是函数,而是int()
,这是默认的初始化,等效于int y = 0
或int 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 type
对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()
是函数类型,因此您会看到错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.