【发布时间】:2019-05-11 14:42:45
【问题描述】:
我注意到带括号的构造函数的行为不同,至少对于浮点数和整数是这样。
// 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 (&)()(或者只是float() 具有正确的转发),所以我认为这是一个默认构造的函数。调用它的结果有一个类型,但调用它会导致您期望的链接器错误。如果它是一个函数指针,它的值为 0。为什么它的值会是 1,或者当它被打印出来时,它是如何以 1 结束的?
【问题讨论】:
-
“我认为这是一个默认构造的函数”。它只是一个功能。那里没有“默认构造”的东西,也没有必要“构造”任何东西。
-
我从链接器错误中看到了这一点,但我从打印的值中假设它必须有自己的值。我没有意识到我正在打印一个函数指针。
-
顺便说一句,我创建了
Wrapper<int> e(),它通过完美转发构造了int value。value是 1。同样的事情发生了吗,int()在变为int之前衰减到int (*)()和bool?我什至添加了Wrapper<S>::Wrapper(void),只有Wrapper<S> e = Wrapper<S>()导致value==0。 -
我尝试了额外的括号来避免函数解析,如
Wrapper<int> (e()),但值仍然是1。
标签: c++ function c++14 function-pointers default-value