In 这个回应 https://stackoverflow.com/a/23274182/420683, 没有手套的 https://stackoverflow.com/users/1902313/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 甚至不发出警告/Wall
并且没有语言扩展/Za
在 MSVC12 Update 1 (2013) 和 MSVC10 SP1 (2010) 中。
输出是:
foo(42)
foo(), 42
在两个版本中。所以没有创建临时的,而是调用了一个构造函数。
问题:
- 这个扩展的名称是什么?
- 不也算是一种延伸吗? (
/Za
和扩展列表 http://msdn.microsoft.com/en-us/library/34h23df8%28v=vs.100%29.aspx似乎不这么认为)
- 是否有此功能的一些文档/官方描述?
(I tagged this question with the [delegating-constructors] tag since it reminds me heavily of this feature)
元信息:我几乎确定这个问题是重复的,因为这个功能有些人所知。例如,参见这个答案 https://stackoverflow.com/a/9359241/420683一个“类似的问题”。如果您能找到描述此功能的答案,请立即将其作为重复项关闭。
它不是构造函数委托。尝试以下代码:
#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)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)