MSVC直接构造函数调用扩展

MSVC direct constructor call extension

本文关键字:函数调用 扩展 MSVC      更新时间:2023-10-16

在该响应中,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();
}

我很惊讶,这甚至在微软风投中编译;clang++、g++和我都认为这是非法的,例如[class.cctor]/2"因为构造函数没有名称,所以它们是在名称查找过程中从未找到"

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

输出为:

foo(42)foo(),42

在两个版本中。所以没有临时创建,而是调用了一个构造函数。

问题:

  1. 这个扩展名叫什么
  2. 这不是延期吗?(/Za和扩展列表似乎并不这么认为)
  3. 是否有此功能的文档/官方描述

(我用[委派构造函数]标记了这个问题,因为它让我想起了这个功能)


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

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

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