Позволяет ли стандарт C ++ использовать typedef для переименования конструктора? - PullRequest
10 голосов
/ 04 января 2012

Я был удивлен, обнаружив, что в VC ++ 10 вы можете использовать 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?

1 Ответ

11 голосов
/ 04 января 2012

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

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

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

A typedef-name не должно использоваться [...] для объявления конструктора.

...