MSVC直接构造函数调用扩展

dyp*_*dyp 8 c++ visual-c++ language-extension delegating-constructor

这个响应中,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();
}
Run Code Online (Sandbox Code Playgroud)

我很惊讶这甚至在MSVC中编译; clang ++,g ++和我同意它是非法的,例如[class.ctor]/2"因为构造函数没有名称,所以在名称查找期间永远找不到它们"

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

输出是:

foo(42)
foo(), 42

在两个版本中.所以没有临时创建,但是一个名为的构造函数.

问题:

  1. 这个扩展名是什么?
  2. 它不被视为延伸吗?(/Za并且扩展列表似乎不这么认为)
  3. 是否有关于此功能的/官方说明的文档?

(我用[delegating-constructors]标签标记了这个问题,因为它让我想起了这个功能)


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

Dmy*_*nko 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;
}
Run Code Online (Sandbox Code Playgroud)

根据输出字段“c”被初始化两次但仅被销毁一次。正如zneak指出的,它类似于new (this) foo(42).

  • 正如[Raymond Chen](http://stackoverflow.com/users/902497/raymond-chen)所说[在对我的问题的评论中](http://stackoverflow.com/questions/23347437/msvc-direct-constructor- call-extension/23547330?noredirect=1#comment36127858_23347437), `this-&gt;foo::foo(42)` 似乎是 `new ((void*)this) foo(42) 的已弃用(“过时”)语法`。当在没有前面的“this-&gt;~foo()”的类的构造函数中使用时,两者都是一个错误。 (2认同)