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
} 

main 関数の右中括弧の前の最後の 2 行でエラーが発生するのはなぜですか? 式 MYINT() が異なるコンテキストで異なる方法で扱われるのはなぜですか? 標準のリファレンスはどれも役に立ちます。

4

5 に答える 5

8

MYINT()コンテキストに応じて、 type の式MYINT、または引数を取らず を返す関数型の指定子として解釈できますMYINT。式または型指定子のいずれかが有効な状況では、あいまいさが生じます。これは、可能であれば型指定子として解釈することで解決されます (編集: 標準参照が必要な場合は C++03 8.2/2)。

sizeof式または括弧で囲まれた型指定子のいずれかを引数として取ることができるため、このあいまいさが生じます。したがって、ここでMYINT()は型指定子として解釈されます。sizeof関数型には適用できないため、エラーが発生します。

編集:括弧を削除して式 ( ) として解釈されるようにするかsizeof MYINT()、余分な括弧を追加して有効な型指定子 ( sizeof((MYINT()))) にしないか、正しい型に変更する( ) ことで、エラーを修正できますsizeof(MYINT)

cout << MYINT()明確なので、エラーは発生しないはずです。実際、私のコンパイラにはありません。エラーは何ですか? また、コンパイラは何ですか?

于 2010-09-03T12:45:29.017 に答える
6

あなたの場合MINTINTtypedef int MYINT関数MYINT()ではありませんint()が、デフォルトの初期化であり、int y = 0またはと同等ですint y = int(0)

あなたの2行目、つまり、同じ理由cout << MYINT()で正しくコンパイルされます。g++ -Wall -ansi -pedantic

ただし、「intのデフォルトコンストラクターへの呼び出し」(編集:これは正しくありません)「許可されていないMYINTを返す関数型」(編集:これは正しい答えです)として解釈されるため、次のエラーでg++文句を言います、Mike を参照)。しかし、これは.sizeoferror: invalid application of "sizeof" to a function typeMYINT()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>.

編集 とのあいまいさの説明については、Mike Seymour の回答もご覧くださいsizeof

于 2010-09-03T12:34:33.140 に答える
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);  
于 2010-09-03T12:36:44.737 に答える
2

main 関数の右中括弧の前の最後の 2 行でエラーが発生するのはなぜですか?

cout << MYINT();coutが定義されていないため、機能しません。と を実行する#include <iostream>using std::cout、正常に動作します。

sizeof(MYINT())実際には機能sizeof(int())しませんが、どちらも機能しないため、それは予想されることです。sizeof(MYINT)うまくいきます。

式 MYINT() が異なるコンテキストで異なる方法で扱われるのはなぜですか?

そうではありません。いずれの場合も、MYINT()とまったく同じように動作しint()ます。

于 2010-09-03T12:36:13.907 に答える
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()関数型であるため、エラーが表示されます。

于 2010-09-03T13:07:20.633 に答える