2010-09-03 4 views
1
#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() обрабатывается по-разному в разных контекстах? Любая стандартная ссылка будет полезна.Неоднозначный синтаксис

+3

Вы могли бы показать объявление MYINT? –

+0

Что такое 'MYINT()'? Я бы помог ответить на ваш вопрос. –

+0

Укажите, как определяется макрос MYINT(). Без этого не получается. –

ответ

2

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

6

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

Edit (снова)

Как сказано в комментарий является cout линии не работает для вас, это потому, что вы, вероятно, забыл include <iostream>.

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

+0

Вам нужно объяснить, почему инициализированное значение недействительно (если оно не указано) в двух других строках. –

+0

@Charles: Отредактировано мое сообщение. –

+0

Почему sizeof интерпретировать int() как функцию, но не временную ценную? –

2

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

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

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

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

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

+0

+1, потому что нет необходимости определять MYINT, чтобы показать те же результаты –

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

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

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

EDIT: Вы можете исправить ошибку, удалив скобки, оно будет интерпретировано как выражение (sizeof MYINT()), добавив дополнительные скобки, это не является допустимым спецификатор типа (sizeof((MYINT()))), или изменить его на правильный type (sizeof(MYINT)).

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

+0

+1. Возможно, стоит показать работу. Один из них - сказать 'sizeof MYINT()' или 'sizeof ((MYINT())) –

+0

Действительно, на втором подтверждении в моей системе нет ошибки в cout << MYINT() !.Извините за вводящую в заблуждение информацию – Chubsdad

Смежные вопросы