我知道构造函数没有返回类型。虽然我想知道,构造函数的类型是什么?构造函数有类型吗?
我尝试过
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声明
构造函数是类的特殊非静态成员函数,该类是 用于初始化其类类型的对象。
我的逻辑是这样的:成员函数有一个类型,构造函数是特殊类型的成员函数,因此它们应该有一个类型。我知道推理有缺陷,但是为什么呢?
答案 0 :(得分:8)
我认为C ++ 17标准中的这些引号将是相关的(15.1构造函数)
1构造函数没有名称。...
和
2构造函数用于初始化其类类型的对象。 由于构造函数没有名称,因此在名称查找过程中永远不会找到它们;但是使用 功能符号(8.5.1.3)将导致构造函数被调用 初始化一个对象。 [注意:用于初始化类的对象 请参阅15.6。 —尾注]
和
10构造函数主体中的return语句不得指定 返回值。不得使用构造函数的地址。
答案 1 :(得分:5)
构造函数实际上没有类型。
该标准没有明确说明这一点可能令人惊讶,但是由于它们没有名称,不参与名称查找,无法获取其地址并且是没有返回类型的“函数”,因此可以推论。
答案 2 :(得分:0)
如果他们有类型,您该怎么办?没事这就是为什么:
如果它们有一个指针,则可以通过获取其构造函数的地址来获取该指针(如果在语法上立即使用结果来初始化正确类型的指针,则获取重载实体的地址是明确的)。
如果他们有指向他们的指针,您该怎么办?没事。
他们没有名字。指向A
的构造函数的非null指针将始终指向&A::A
。您也可以删除指针样板并直接“调用构造函数”。