构造函数的类型是什么?

问题描述 投票:0回答:3

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

我试过这个

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状态

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

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

c++ constructor pointer-to-member name-lookup
3个回答
8
投票

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

1 构造函数没有名字......

2 构造函数用于初始化其类类型的对象。 因为构造函数没有名称,所以在名称查找期间永远找不到它们;然而,使用显式类型转换 函数符号(8.5.1.3)将导致构造函数被调用 初始化一个对象。 [ 注意:用于类对象的初始化 类型见 15.6。 — 尾注]

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


5
投票

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

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


0
投票

如果他们有某种类型,你能做什么?完全没有。这就是为什么:

如果他们有一个,您也许能够通过获取构造函数的地址来获取指向构造函数的指针(如果立即在语法上使用结果来初始化正确类型的指针,则获取重载实体的地址是明确的)。

如果他们有指向他们的指针,你能做什么?完全没有。

他们没有名字。指向

A
构造函数的非空指针将始终指向
&A::A
。您不妨删除指针样板并直接“调用构造函数”。

© www.soinside.com 2019 - 2024. All rights reserved.