构造函数的类型是什么?
What is the type of a constructor?
我知道构造函数没有 return 类型。虽然我想知道,那么构造函数的类型是什么?构造函数有类型吗?
我试过了
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 状态
Constructor is a special non-static member function of a class that is
used to initialize objects of its class type.
我的逻辑是这样的:成员函数有一个类型,构造函数是特殊类型的成员函数,因此它们应该有一个类型。我知道推理有问题,但为什么呢?
我认为 C++ 17 标准中的这些引用是相关的(15.1 构造函数)
1 Constructors do not have names....
和
2 A constructor is used to initialize objects of its class type.
Because constructors do not have names, they are never found during name lookup; however an explicit type conversion using the
functional notation (8.5.1.3) will cause a constructor to be called to
initialize an object. [ Note: For initialization of objects of class
type see 15.6. — end note ]
和
10 A return statement in the body of a constructor shall not specify a
return value. The address of a constructor shall not be taken.
构造函数实际上没有类型。
标准没有明确说明这一点可能令人惊讶,但由于它们没有名称,不参与名称查找,无法获取其地址并且 "functions" 没有 return类型,可以推导。
如果他们有类型,你会怎么做?完全没有。这就是为什么:
如果他们有的话,您也许可以通过获取构造函数的地址来获取指向构造函数的指针(如果在语法上立即使用结果来初始化正确类型的指针,则获取重载实体的地址是明确的).
如果他们有指向他们的指针,你会怎么做?完全没有。
他们没有名字。指向 A
的构造函数的非空指针将始终指向 &A::A
。您不妨直接删除指针样板和 "call the constructor"。
我知道构造函数没有 return 类型。虽然我想知道,那么构造函数的类型是什么?构造函数有类型吗?
我试过了
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 状态
Constructor is a special non-static member function of a class that is used to initialize objects of its class type.
我的逻辑是这样的:成员函数有一个类型,构造函数是特殊类型的成员函数,因此它们应该有一个类型。我知道推理有问题,但为什么呢?
我认为 C++ 17 标准中的这些引用是相关的(15.1 构造函数)
1 Constructors do not have names....
和
2 A constructor is used to initialize objects of its class type. Because constructors do not have names, they are never found during name lookup; however an explicit type conversion using the functional notation (8.5.1.3) will cause a constructor to be called to initialize an object. [ Note: For initialization of objects of class type see 15.6. — end note ]
和
10 A return statement in the body of a constructor shall not specify a return value. The address of a constructor shall not be taken.
构造函数实际上没有类型。
标准没有明确说明这一点可能令人惊讶,但由于它们没有名称,不参与名称查找,无法获取其地址并且 "functions" 没有 return类型,可以推导。
如果他们有类型,你会怎么做?完全没有。这就是为什么:
如果他们有的话,您也许可以通过获取构造函数的地址来获取指向构造函数的指针(如果在语法上立即使用结果来初始化正确类型的指针,则获取重载实体的地址是明确的).
如果他们有指向他们的指针,你会怎么做?完全没有。
他们没有名字。指向 A
的构造函数的非空指针将始终指向 &A::A
。您不妨直接删除指针样板和 "call the constructor"。