Расширение прямого вызова MSVC

В этот ответ, tloveless указал, что в MSVC можно использовать this->foo::foo(42); для делегирования конструктора напрямую вызвать конструктор:

#include <iostream>

struct foo
{
int m;
foo(int p) : m(p) { std::cout << "foo("<<p<<")\n"; }
foo()
: m(0)
{
this->foo::foo(42);
std::cout << "foo(), " << m << "\n";
}
};

int main()
{
foo f;
std::cin.ignore();
}

Я был удивлен, что это даже компилируется в MSVC; clang ++, g ++ и я согласны с тем, что это незаконно, например [class.ctor] / 2 «Поскольку у конструкторов нет имен, они
не найдено во время поиска имени

Тем не менее, MSVC даже не выдает предупреждение с /Wall и без языковых расширений /Za в MSVC12, обновление 1 (2013) и MSVC10 SP1 (2010).

Выход:

Foo (42)
foo (), 42

в обеих версиях. Так что нет никакого временного созданного, но конструктор называется.

Вопросы:

  1. Как называется это расширение?
  2. Разве это не считается расширением? (/Za и список расширений не кажется так)
  3. Есть ли документация для / официального описания этой функции?

(Я пометил этот вопрос тегом [Delegating-Constructors], так как он сильно напоминает мне об этой функции)


meta-info: я почти уверен, что этот вопрос является дубликатом, так как эта функция несколько известна. Например, см. этот ответ на «похожий вопрос». Пожалуйста, не стесняйтесь закрывать это как дубликат, если вы можете найти ответ, который описывает эту функцию.

8

Решение

Это не делегирование конструктора. Попробуйте следующий код:

#include <iostream>

class C{
public:
C() { std::cout << "C" << std::endl; }
~C() { std::cout << "~C" << std::endl; }
};

struct foo
{
int m;
C c;
foo(int p) : m(p) { std::cout << "foo("<<p<<")\n"; }
foo()
: m(0)
{
this->foo::foo(42);
std::cout << "foo(), " << m << "\n";
}
};

int main()
{
foo f;
}

Согласно выходному полю «c» инициализируется дважды, но уничтожается только один раз. Как zneak отметил, это похоже на new (this) foo(42),

1

Другие решения


По вопросам рекламы [email protected]