Неоднозначный синтаксис - PullRequest
       3

Неоднозначный синтаксис

1 голос
/ 03 сентября 2010
#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 ]

8 голосов
/ 03 сентября 2010

MYINT() может, в зависимости от контекста, интерпретироваться как выражение типа MYINT или как спецификатор типа функции, не принимающий аргументов и возвращающий MYINT. В некоторых ситуациях, когда допустимо выражение или спецификатор типа, это дает неоднозначность; это решается путём интерпретации его как спецификатора типа, если это возможно ( EDIT : C ++ 03 8.2 / 2, если вы хотите стандартную ссылку).

sizeof может принимать выражение или указатель типа в скобках в качестве аргумента, что придает эту двусмысленность. Так что здесь MYINT() интерпретируется как спецификатор типа; тогда вы получите сообщение об ошибке, поскольку sizeof нельзя применить к типу функции.

РЕДАКТИРОВАТЬ: Вы можете исправить ошибку, удалив скобки, чтобы она интерпретировалась как выражение (sizeof MYINT()), добавив дополнительные скобки, чтобы он не был действительным спецификатором типа (sizeof((MYINT())) ) или изменив его на правильный тип (sizeof(MYINT)).

cout << MYINT() недвусмысленно, поэтому не должно быть ошибок, и на самом деле этого нет в моем компиляторе. В чем ошибка, и какой у вас компилятор?

6 голосов
/ 03 сентября 2010

Если ваш 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" ( EDIT : это не так правильно) «тип функции, возвращающий MYINT, который не разрешен» ( EDIT : это правильный ответ, см. Майк). Но это не имеет ничего общего с 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>.

Редактировать Посмотрите также ответ Майка Сеймура для объяснения двусмысленности с sizeof.

3 голосов
/ 03 сентября 2010
// 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);  
2 голосов
/ 03 сентября 2010

Я не вижу ошибок для строки 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() является типом функции, и поэтому вы видите ошибку.

2 голосов
/ 03 сентября 2010

Почему две последние строки в основной функции перед закрывающей скобкой дают ошибку?

cout << MYINT(); не работает, поскольку cout не определено.Как только вы выполните #include <iostream> и using std::cout, все будет работать нормально.

sizeof(MYINT()) действительно не работает, но sizeof(int()) тоже не работает, так что этого следовало ожидать.sizeof(MYINT) будет работать просто отлично.

Почему выражение MYINT () обрабатывается по-разному в разных контекстах?

Это не так.В каждом случае MYINT() ведет себя так же, как int().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...