c++ - MSVC 直接构造函数调用扩展

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

this response , tloveless指出在 MSVC 中可以使用 this->foo::foo(42); for constructor delegation 直接调用构造函数:

#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. 是否有此功能的一些文档/官方描述?

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


元信息:我几乎可以肯定这个问题是重复的,因为这个功能是众所周知的。例如,参见 this answer到一个“类似的问题”。如果您能找到描述此功能的答案,请不要犹豫,将其作为拷贝关闭。

最佳答案

它不是构造函数委托(delegate)。试试下面的代码:

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

关于c++ - MSVC 直接构造函数调用扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23347437/

相关文章:

c++ - 是否有人建议扩展 C++ 语言以消除 pimpl?

c++ - 错误 : field ‘m_ssmmap’ has incomplete type C++

c++ - 使用模板重载运算符,但防止重新定义

c++ - 如何使 C++ 实时服务器应用程序保持现代 Web 客户端界面?

c++ - Visual Studio 生成的静态库最大文件大小或其他限制?

c++ - 自定义操纵器使用 Visual C++ 而非 g++/clang 进行编译

c++ - Irrlicht:如何将 ISceneNode 转换为 IMeshSceneNode?

c++ - 面对 recv() 和 send() winsock api 的问题。 Recv() 在接收最后一个数据包时挂起

haskell - MTL 库需要哪些语言扩展?

c++ - 在 .h 文件包含在多个 cpp 文件中的类中定义 integral static const