use*_*570 5 c++ constructor types function language-lawyer
我最近了解到,构造函数在 C++ 中没有名称以及有关它们的其他一些信息。我还知道函数在 C++ 中有一种称为函数类型的类型。例如,
void func(int)
{
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中, 的函数类型func为。 void (int)
现在,我想知道,由于构造函数是特殊的成员函数,那么它们是否也具有如上所示的类型。例如说我们有:
struct Name
{
Name(int)
{
}
};
Run Code Online (Sandbox Code Playgroud)
上面所示的构造函数是否也像普通函数或普通成员函数一样具有函数类型。如果是,那么我们如何找到该类型。就像我们可以decltype在普通函数上使用一样,是否允许decltype在构造函数上使用来查找它们的类型。
\n\n是否允许
\ndecltype在构造函数上使用来查找其类型
这是不允许的。主要是因为无法命名构造函数。一个常见的用词不当是像Name(0)ornew Name(0)这样的表达式调用构造函数。但情况并非如此func(0)。构造函数永远不会被我们直接调用,而是总是由需要生成新对象的语言构造间接调用。
\n\n[将军级]
\n1 ...构造函数没有名称。
\n2构造函数用于初始化其类类型的对象。因为构造函数没有名称,所以在名称查找期间永远找不到它们;然而,使用函数符号 ([expr.type.conv]) 的显式类型转换将导致调用构造函数来初始化对象。\n[注 1:语法看起来像构造函数的显式调用。\xe2\x80\x94 尾注]
\n
因为我们无法命名它们,所以我们无法使用内省机制decltype来检查它们。因此,该标准没有为构造函数指定“类型”,因为严格符合标准的程序无法检查所述类型。
构造函数也不能拥有签名(如标准所定义),因为根据定义,构造函数包括函数名称(并且如上所述,构造函数是无名的)。
\n\n\n\n\xe2\x9f\xa8class 成员函数\xe2\x9f\xa9 名称、参数类型列表、函数所属的类、cv 限定符(如果有)、ref 限定符(如果有)和尾随要求- 条款(如果有)
\n