2010-09-03 72 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的聲明嗎? – 2010-09-03 12:31:10

+0

什麼是'MYINT()'?我會幫助我們回答你的問題。 – 2010-09-03 12:31:45

+0

請發佈如何定義MYINT()宏。如果沒有這個,就會有幫助 – 2010-09-03 12:31:51

回答

2

我沒有看到cout << MYINT();行的任何錯誤。但是我看invalid application of 'sizeof' to a function typecout << sizeof(MYINT());行。問題是()MYINT()。 C++標準說,這對sizeof以及它是如何解析:

sizeof unary-expression 
sizeof (type-id) 

sizeof unary-expressionsizeof (type-id)之間的解析歧義。它通過使用更長的匹配來解決。它解析sizeof (MYINT())sizeof (type-id)MYINT()是一個函數類型,因此你會看到錯誤。

6

如果您MINTINTtypedef int MYINT然後MYINT()不是功能,而是int()這是一個默認的初始化,equivallent到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()) 
} 

編輯(再)

至於說在註釋中是cout行不爲你工作,這是因爲你可能忘了include <iostream>

編輯 看也邁克·西摩爲歧義與sizeof解釋答案。

+0

您需要解釋爲什麼在其他兩行中初始化的臨時值無效(如果不是)。 – 2010-09-03 12:37:45

+0

@Charles:編輯我的帖子。 – 2010-09-03 12:39:17

+0

爲什麼sizeof將int()作爲函數來解釋,但不是暫時的有價值的東西? – 2010-09-03 12:43:27

2

爲什麼最後兩行在大括號之前的大括號會給出錯誤?

cout << MYINT();不起作用,因爲cout未定義。一旦你做#include <iostream>using std::cout,它會正常工作。

sizeof(MYINT())確實不起作用,但sizeof(int())也不起作用,所以這是可以預料的。 sizeof(MYINT)將工作得很好。

爲什麼表達式MYINT()在不同的上下文中處理方式不同?

不是。在每種情況下,MYINT()的行爲與int()完全相同。

+0

+1因爲沒有必要定義MYINT來顯示相同​​的結果 – 2010-09-03 12:41:41

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不能應用於函數類型。

編輯:可以通過去除括號所以它將被解釋爲表達式(sizeof MYINT())修復錯誤,添加額外的括號,所以它不是一個有效的類型說明符(sizeof((MYINT()))),或者它改變爲正確的類型(sizeof(MYINT))。

cout << MYINT()是明確的,所以應該沒有錯誤,並且確實沒有在我的編譯器上。什麼是錯誤,你的編譯器是什麼?

+0

+1。可能值得展示工作。其中之一就是說'sizeof MYINT()'或'sizeof((MYINT()))' – 2010-09-03 14:09:37

+0

事實上,在我的系統的第二次確認上,cout << MYINT()也沒有錯誤。對於誤導性信息抱歉 – Chubsdad 2010-09-04 00:55:13