在这个回复中,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
在两个版本中。所以没有临时创建,而是调用了一个构造函数。
问题:
- 这个扩展名是什么?
- 它不被视为扩展吗?(
/Za
并且扩展列表似乎不这么认为) - 是否有此功能的一些文档/官方描述?
(我用 [delegating-constructors] 标签标记了这个问题,因为它让我想起了这个功能)
元信息:我几乎可以肯定这个问题是重复的,因为这个功能是众所周知的。例如,请参阅“类似问题”的此答案。如果您能找到描述此功能的答案,请不要犹豫,将其作为 dup 关闭。