2012-01-04 26 views
9

Tôi rất ngạc nhiên khi thấy rằng trong VC++ 10, bạn có thể sử dụng một typedef để thay đổi tên của constructor của một lớp:Chuẩn C++ có cho phép sử dụng typedef để đổi tên một hàm tạo không?

#include <iostream> 

using namespace std; 

class A 
{ 
private: 
    typedef A alias; 

public: 
    alias() { cout << "A ctor" << endl; } 
}; 

int main() 
{ 
    A(); // prints "A ctor" 
    return 0; 
} 

là tiêu chuẩn này C++ hoặc một phần mở rộng của Microsoft?

+0

Không chắc chắn về tiêu chuẩn, nhưng g ++ và clang ++ cả lỗi trên mã này. –

+0

g ++ trả về 'ISO C++ cấm tuyên bố 'bí danh' không có loại' – dasblinkenlight

Trả lời

11

Không; nhà thầu không có tên. Bạn không thể lấy địa chỉ của một hàm tạo hoặc truyền một con trỏ hàm, hoặc thậm chí chỉ cần gọi nó giống như một hàm bình thường. Cú pháp A::A() chỉ là một cú pháp khai báo đặc biệt cho phép bạn khai báo và định nghĩa các hàm tạo, nhưng nó không phải là một tên .

Điều đó nói rằng, bạn không thể typedef đối tượng (bao gồm cả con trỏ hàm), chỉ loại.

Để bình luận về hành vi MSVC, tôi trích dẫn từ 12,1/3:

Một typedef tên không được sử dụng [...] cho một tuyên bố constructor.

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