MSVC直接构造函数调用扩展
MSVC direct constructor call extension
在该响应中,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();
}
我很惊讶,这甚至在微软风投中编译;clang++、g++和我都认为这是非法的,例如[class.cctor]/2"因为构造函数没有名称,所以它们是在名称查找过程中从未找到"
然而,在MSVC12 Update 1(2013)和MSVC10 SP1(2010)中,MSVC甚至不会发出带有/Wall
且没有语言扩展/Za
的警告。
输出为:
foo(42)foo(),42
在两个版本中。所以没有临时创建,而是调用了一个构造函数。
问题:
- 这个扩展名叫什么
- 这不是延期吗?(
/Za
和扩展列表似乎并不这么认为) - 是否有此功能的文档/官方描述
(我用[委派构造函数]标记了这个问题,因为它让我想起了这个功能)
meta信息:我几乎可以肯定这个问题是重复的,因为这个功能在某种程度上是已知的。例如,请参阅"类似问题"的答案。如果您能找到描述此功能的答案,请不要犹豫将其作为dup关闭。
它不是构造函数委派。尝试以下代码:
#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++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 内联扩展编译为函数调用 [C++]
- 模板 使用数据数组调用函数时扩展参数包
- 通过 system() 函数调用防止野卡扩展
- 定义参数包扩展的"pattern",尤其是在函数调用中
- 可变模板扩展中函数调用的顺序
- 使用可变包类型扩展的C++函数调用程序包装
- 从 C++ 节点调用 JavaScript 函数.js扩展
- MSVC直接构造函数调用扩展