我注意到带括号的构造函数的行为有所不同,至少对于浮点数和整数而言。
class
这不是默认的构造函数,括号被解析为该类型的一部分。我打印了这些类型,并且// int a, b{}, c = T(), d = T{}, e();
float a, b{}, c = T(), d = T{}, e();
endl(std::cout << a << ", " << b << ", " << c << ", " << d << ", " << e);
// 0, 0, 0, 0, 1
的类型为e
(或者只是float (&)()
,带有正确的转发),所以我认为它是默认构造的函数。调用它的结果具有类型,但是调用它会导致您期望的链接器错误。如果它是一个函数指针,则其值为0。为什么它的值是1,或者在打印时它最终变成1?
答案 0 :(得分:3)
float e();
这将e声明为一个返回float且不带参数的函数。因此,除非设置了boolalpha
,否则它会衰减为一个函数指针,该函数指针会变为显示1的布尔值。
答案 1 :(得分:2)
它不是函数指针,实际上是一个函数(尽管未定义)。
通过流送衰减的表达式e
,您正在创建指向该函数的指针,并且该指针有效,因为它指向您声明为{的函数{1}}。因此,e
。
您说的很对,如果您声明一个函数指针开始并将其设置为1
,那么您会看到nullptr
而不是通过流式传输。但是函数和函数指针是两件事。