8

这个回复中,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在 MSVC12 Update 1 (2013) 和 MSVC10 SP1 (2010)中甚至不会发出带有/Wall和不带有语言扩展的警告。/Za

输出是:

富(42)
富(),42

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

问题:

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

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


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

4

1 回答 1

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

于 2014-05-08T16:23:59.403 回答