在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
在两个版本中。所以没有临时创建,而是调用了一个构造函数。
问题:
- 此扩展程序的名称是什么?
- 它不被认为是一个扩展吗? (
/Za
和list of extensions 好像不这么认为) - 是否有此功能的一些文档/官方描述?
(我用 [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/