在this response中,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“因为构造函数没有名称,所以它们是 在名称查找过程中找不到“
但是,在MSVC12 Update 1(2013)和MSVC10 SP1(2010)中,MSVC甚至不会发出/Wall
且没有语言扩展/Za
的警告。
输出结果为:
foo(42) foo(), 42
两个版本。所以没有临时创建,而是一个名为。
的构造函数问题:
/Za
和list of extensions似乎不这么认为)(我用[delegating-constructors]标签标记了这个问题,因为它让我想起了这个功能)
答案 0 :(得分: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)
。