模糊语法

Chu*_*dad 1 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
} 
Run Code Online (Sandbox Code Playgroud)

为什么关闭括号前主函数中的最后两行会出错?为什么表达式MYINT()在不同的上下文中被区别对待?任何标准参考都会有所帮助.

Mik*_*our 8

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

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

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

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


Ced*_* H. 6

如果你MINTINTtypedef int MYINT当时MYINT()不是一个函数,而是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的函数类型是不允许的"(编辑:这是正确的答案) ,见迈克).但这与此无关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())
}
Run Code Online (Sandbox Code Playgroud)

编辑(再次)

正如评论中所说,cout线条不适合你,这是因为你可能忘了include <iostream>.

编辑 看看迈克西摩的答案,解释模糊性sizeof.

  • Ints没有"默认构造函数".所以这是一个错误的答案,但代表@Mike的正确答案.然而,它被提升到+7而@ Mike的答案是+3.奇怪的! (2认同)