2012-01-04 2 views
9

я с удивлением обнаружили, что в VC++ 10, вы можете использовать ЬурейиЙ изменить имя конструктора класса:Позволяет ли стандарту C++ использовать typedef для переименования конструктора?

#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; 
} 

Является ли это стандартный C++ или расширение Microsoft?

+0

Не уверен в стандарте, но g ++ и clang ++ обе ошибки в этом коде. –

+0

g ++ возвращает 'ISO C++ запрещает объявление 'псевдонима' без типа' – dasblinkenlight

ответ

11

Нет; конструкторы не имеют названия. Вы не можете взять адрес конструктора или передать указатель функции, или даже просто позвонить это как обычная функция. Синтаксис A::A() - это просто специальный синтаксис декларатора, который позволяет объявлять и определять конструкторы, но это не имя .

, что сказал, вы не можете объекты определение типа во (включая указатели на функции) в любом случае, только типы.

Чтобы прокомментировать поведение MSVC, цитирую 12.1/3:

ЬурейеЕ имяне могут быть использованы [...] для объявления конструктора.

Смежные вопросы