2015-10-28 25 views
9

関数はtypeidの中で呼び出されていませんか?以下のコードを考えてみましょう。関数がtypeidの中で呼び出されていませんか?

#include <iostream> 
#include <typeinfo> 
using namespace std; 

int mul10(int &s) 
{ 
    static int count = 1; 
    cout << "Evaluating call " << count << endl; 
    count++; 
    s *= 10; 
    return(s); 
} 

int main() 
{ 
    int i = 5; 
    cout << typeid(mul10(i)).name() << endl; 
    cout << i << endl; 
    return(0); 
} 

ので、ここでの出力は、そうはっきりiの値が変更されていないとも機能mul10が実際に呼び出されなかった

int 
5 

です。これは、typeid引数がどのように評価されるのでしょうか?

+4

関数を呼び出す必要はありません。結果の型は、コンパイラによって既に認識されています。 –

+0

http://en.cppreference.com/w/cpp/language/typeid –

+1

「必須ではありません」以上です。コンパイラ*はこの場合関数を呼び出すことはできません。例えば。このプログラムは正しいです: 'int x(){return 1/0; } int main(){typeid(x()); } ' –

答えて

12

typeidのオペランドは、多型クラス型のglvalueである場合にのみ評価されます。返される型がmul10、つまりintであるため、多型のクラス型ではないため、オペランドは評価されません。つまり、mul10が呼び出されません。

+0

リファレンス:C++ 14 [expr.typeid]/3 –

+0

ブライアンに感謝します。それはたくさん説明します。 – anupamb

1

C++標準のドラフトに進むと、ポリモーフィックなクラス型の式glvalueが結果がオブジェクトの静的型に基づいていない限り、それがわかります。強調鉱山のセクション5.2.8から[expr.typeid]:タイプIDが多型、クラス型のglvalue以外表現に適用される場合

、結果はSTDに を意味:: TYPE_INFOオブジェクトが表します式の静的型。 Lvalue-to-rvalue(4.1)、array-topointer (4.2)、および関数からポインタ(4.3)への変換は式に適用されません。 式の型がクラス型の場合、そのクラスは完全に定義されます。式は未評価のオペランド (第5項)です。

関連する問題