dyp*_*dyp 8 c++ visual-c++ language-extension delegating-constructor
在这个响应中,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();
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶这甚至在MSVC中编译; clang ++,g ++和我同意它是非法的,例如[class.ctor]/2"因为构造函数没有名称,所以在名称查找期间永远找不到它们"
但是,在MSVC12 Update 1(2013)和MSVC10 SP1(2010)中,MSVC甚至不会发出带有/Wall和不带语言扩展的警告/Za.
输出是:
foo(42) foo(), 42
在两个版本中.所以没有临时创建,但是一个名为的构造函数.
问题:
/Za并且扩展列表似乎不这么认为)(我用[delegating-constructors]标签标记了这个问题,因为它让我想起了这个功能)
meta-info:我几乎可以肯定这个问题是重复的,因为这个功能在某种程度上是已知的.例如,请参阅"类似问题"的答案.如果您能找到描述此功能的答案,请不要犹豫,将其作为副本关闭.
它不是构造函数委托。尝试以下代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
根据输出字段“c”被初始化两次但仅被销毁一次。正如zneak指出的,它类似于new (this) foo(42).
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |