【问题标题】:Why is the default value of a function 1? [duplicate]为什么函数的默认值是 1? [复制]
【发布时间】: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 (&amp;)()(或者只是float() 具有正确的转发),所以我认为这是一个默认构造的函数。调用它的结果有一个类型,但调用它会导致您期望的链接器错误。如果它是一个函数指针,它的值为 0。为什么它的值会是 1,或者当它被打印出来时,它是如何以 1 结束的?

【问题讨论】:

  • “我认为这是一个默认构造的函数”。它只是一个功能。那里没有“默认构造”的东西,也没有必要“构造”任何东西。
  • 我从链接器错误中看到了这一点,但我从打印的值中假设它必须有自己的值。我没有意识到我正在打印一个函数指针。
  • 顺便说一句,我创建了Wrapper&lt;int&gt; e(),它通过完美转发构造了int valuevalue 是 1。同样的事情发生了吗,int() 在变为 int 之前衰减到 int (*)()bool?我什至添加了Wrapper&lt;S&gt;::Wrapper(void),只有Wrapper&lt;S&gt; e = Wrapper&lt;S&gt;() 导致value==0
  • 我尝试了额外的括号来避免函数解析,如Wrapper&lt;int&gt; (e()),但值仍然是1。

标签: c++ function c++14 function-pointers default-value


【解决方案1】:
float e();

这将 e 声明为一个返回 float 且不带参数的函数。所以这会衰减为一个函数指针,该指针会衰减为 bool,除非设置了boolalpha,否则它会打印 1。

【讨论】:

    【解决方案2】:

    它不是函数指针,它实际上是一个函数(尽管是未定义的)。

    通过流式传输表达式 e,它会衰减,您正在创建一个指向该函数的指针,并且该指针是有效的,因为它指向您声明的名为 e 的函数.因此,1

    您说得对,如果您声明一个函数指针以开始,并将其设为nullptr,您将看到0,而不是通过流式传输它。但是函数和函数指针是两个不同的东西。

    【讨论】:

    • 因此,1?你是说它打印为布尔值吗?
    • 实际上就是这样。对不起,我怀疑你!
    • @JohnP 没错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多