构造函数的类型是什么?

时间:2019-07-26 10:11:36

标签: c++ constructor member-function-pointers name-lookup

我知道构造函数没有返回类型。虽然我想知道,构造函数的类型是什么?构造函数有类型吗?

我尝试过

struct A { A() {} };

template <typename A> struct foo;

int main() { foo< decltype(&A::A) > f; }

获取错误(gcc)

prog.cc: In function 'int main()':
prog.cc:5:32: error: taking address of constructor 'constexpr A::A(A&&)'
    5 | int main() { foo< decltype(&A::A) > f; }
      |                                ^
prog.cc:5:35: error: template argument 1 is invalid
    5 | int main() { foo< decltype(&A::A) > f; }
      |                                   ^

...好吧,我不能接受这个地址。同样失败了:

int main() { foo< decltype(A::A) > f; }

prog.cc: In function 'int main()':
prog.cc:5:32: error: decltype cannot resolve address of overloaded function
    5 | int main() { foo< decltype(A::A) > f; }
      |                                ^
[...]

这可能只是一个非常混乱的错误消息,是由与上述相同的原因引起的(无法获取构造函数的地址),我不知道还要尝试什么。

构造函数的类型是什么?

如果没有类型,那是什么?当然不是A (member_function)()

PS :为澄清我的困惑:cpprefernce声明

  

构造函数是类的特殊非静态成员函数,该类是   用于初始化其类类型的对象。

我的逻辑是这样的:成员函数有一个类型,构造函数是特殊类型的成员函数,因此它们应该有一个类型。我知道推理有缺陷,但是为什么呢?

3 个答案:

答案 0 :(得分:8)

我认为C ++ 17标准中的这些引号将是相关的(15.1构造函数)

  

1构造函数没有名称。...

  

2构造函数用于初始化其类类型的对象。   由于构造函数没有名称,因此在名称查找过程中永远不会找到它们;但是使用   功能符号(8.5.1.3)将导致构造函数被调用   初始化一个对象。 [注意:用于初始化类的对象   请参阅15.6。 —尾注]

  

10构造函数主体中的return语句不得指定   返回值。不得使用构造函数的地址。

答案 1 :(得分:5)

构造函数实际上没有类型。

该标准没有明确说明这一点可能令人惊讶,但是由于它们没有名称,不参与名称查找,无法获取其地址并且是没有返回类型的“函数”,因此可以推论。

答案 2 :(得分:0)

如果他们有类型,您该怎么办?没事这就是为什么:

如果它们有一个指针,则可以通过获取其构造函数的地址来获取该指针(如果在语法上立即使用结果来初始化正确类型的指针,则获取重载实体的地址是明确的)。

如果他们有指向他们的指针,您该怎么办?没事。

他们没有名字。指向A的构造函数的非null指针将始终指向&A::A。您也可以删除指针样板并直接“调用构造函数”。