2015-10-28 28 views
9

Là một hàm không được gọi bên trong một typeid? Hãy xem xét mã bên dưới.Chức năng không được gọi là bên trong 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); 
} 

Vì vậy, đây là sản lượng

int 
5 

Vì vậy, rõ ràng giá trị của i không thay đổi và cũng là chức năng mul10 đã không thực sự gọi. Đó là cách các đối số typeid được đánh giá?

+4

Không cần thiết phải gọi hàm, loại kết quả đã được trình biên dịch biết đến. –

+0

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

+1

Nó nhiều hơn "không cần thiết"; trình biên dịch * không được * gọi hàm trong trường hợp này. Ví dụ. chương trình này là chính xác: 'int x() {return 1/0; } int main() {typeid (x()); } ' –

Trả lời

12

Toán hạng của typeid chỉ được đánh giá nếu đó là glvalue của loại lớp đa hình. Vì kiểu trả về là mul10, cụ thể là int, không phải là loại lớp đa hình, toán hạng không được đánh giá, có nghĩa là mul10 không được gọi.

+0

: C++ 14 [expr.typeid]/3 –

+0

Cảm ơn Brian. Điều đó giải thích rất nhiều. – anupamb

1

Nếu chúng ta đi đến dự thảo tiêu chuẩn C++, nó cho chúng ta biết rằng trừ khi biểu thức glvalue của một loại lớp đa hình kết quả dựa trên kiểu tĩnh của đối tượng. Từ phần 5.2.8[expr.typeid] với tôi nhấn mạnh:

Khi typeid được áp dụng cho một biểu khác hơn là một glvalue của một loại lớp đa hình, kết quả đề cập đến một std :: type_info đối tượng đại diện loại tĩnh của biểu thức. Lvalue-to-rvalue (4.1), các dấu đầu dòng mảng (4.2) và các chuyển đổi hàm-tới-con trỏ (4.3) không được áp dụng cho biểu thức. Nếu loại biểu thức là loại lớp, lớp sẽ được xác định hoàn toàn. Biểu thức là toán hạng chưa được đánh giá (Khoản 5).

Các vấn đề liên quan