【问题标题】:return type nodiscard function and void function definition返回类型 nodiscard 函数和 void 函数定义
【发布时间】:2021-12-19 02:23:45
【问题描述】:

如果我有一个返回bool 的函数版本,我想要一个不返回bool 的函数版本。我在函数定义周围尝试了nodiscard,但它不允许两个定义。

返回布尔值的函数是否与返回 void 的函数的速度相同? 如果没有,那么有没有办法声明函数的 void 和 bool 版本?

【问题讨论】:

  • 您不能仅根据返回类型重载函数。如果您的目标是拥有[[nodiscard]] bool myFunction()void myFunction() 之类的东西,并且让编译器根据您是否使用返回值来决定调用哪个...您将需要一些其他方法来区分这些函数,并且或许可以多解释一下最初是什么促使您尝试这种方法。
  • 您不能有两个仅因返回类型而异的重载函数。返回一个被忽略的布尔值不需要任何成本。
  • 嗯,我不太清楚函数调用在幕后是如何工作的,但我只是想通了,如果你不使用变量,编译器可以从选择正确的输出中受益。对我来说正确的输出应该是什么似乎很明显。但我不知道编译器做了什么。或者如果一个 void 函数仍然返回一个我们看不到的值。希望编译器知道我什么时候想要返回函数的 void 版本。与标准向量 emplace back 一样,它返回一个迭代器。当我使用 push back 它返回 void 所以我可以在 void 函数中返回该函数。

标签: c++ function boolean void


【解决方案1】:

返回布尔值的函数与返回 void 的函数的速度相同吗?

将值分配给bool 并丢弃bool 返回值的开销微乎其微,以至于不会引起注意。因此,从本质上讲,对于所有实际目的来说都是肯定的。

有没有办法声明函数的 void 和 bool 版本?

函数不能仅根据返回值重载。您必须使用单独的函数名称:

bool myFunctionWithResult()
{
    ...
    return ...;
}

void myFunctionWithoutResult()
{
    myFunctionWithResult();
}
void doSomething()
{
    bool result = myFunctionWithResult();
    // use result as needed...
}

void doSomethingElse()
{
    myFunctionWithoutResult();
}

或者给其中一个输出参数:

void myFunction(bool &result)
{
    ...
    result = ...;
}

void myFunction()
{
    bool ignored;
    myFunction(ignored);
}
void doSomething()
{
    bool result;
    myFunction(result);
    // use result as needed...
}

void doSomethingElse()
{
    myFunction();
}

在这种情况下,您可以将其简化为一个函数:

void myFunction(bool *result = nullptr)
{
    ...
    if (result)
        *result = ...;
}
void doSomething()
{
    bool result;
    myFunction(&result);
    // use result as needed...
}

void doSomethingElse()
{
    myFunction();
}

不用说,对于bool(或任何其他原始类型)来说,这是不必要的复杂。只需returnbool/primitive,如果它愿意,让调用者丢弃该值。这种微优化只有在输出是更复杂的类型时才真正重要,例如具有动态分配成员的类,其中返回实例实际上会调用您有时可能需要避免的开销。

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 2021-12-18
    • 2019-10-08
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多