MSVC直接构造函数调用扩展

时间:2014-04-28 17:26:43

标签: c++ visual-c++ language-extension delegating-constructor

this response中,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“因为构造函数没有名称,所以它们是 在名称查找过程中找不到“

但是,在MSVC12 Update 1(2013)和MSVC10 SP1(2010)中,MSVC甚至不会发出/Wall且没有语言扩展/Za的警告。

输出结果为:

foo(42)
foo(), 42

两个版本。所以没有临时创建,而是一个名为。

的构造函数

问题:

  1. 此分机的名称是什么?
  2. 它不被视为延期吗? (/Zalist of extensions似乎不这么认为)
  3. 是否有关于此功能的/官方说明的文档?
  4. (我用[delegating-constructors]标签标记了这个问题,因为它让我想起了这个功能)


    元信息:我几乎可以肯定这个问题是重复的,因为这个功能在某种程度上是已知的。例如,请参阅this answer到“类似问题”。如果您能找到描述此功能的答案,请不要犹豫,将其作为副本关闭。

1 个答案:

答案 0 :(得分:1)

它不是构造函数委托。请尝试以下代码:

#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)