如何使用命名变量为const rvalue引用参数定义默认值?

埃雷里卡

我有一个复杂的类类型,我想定义一个默认的常量实例,该实例可以复制用作函数的参数。我还想将该实例用作默认参数,以便在没有该实例的情况下可以调用该函数。该函数需要一个常量值引用。

在以下代码中,函数test1的缺点在于,用于定义默认值的代码是重复的。

函数test2有效吗?第一次调用后,defaultS会保持未指定状态吗?在那种情况下,是否有更好的方法来避免代码重复?

无论是否进行优化(gcc 4.8)进行编译,该代码都会按预期输出2 1 1。但是,可以依靠它与任何支持c ++ 11的编译器一起工作吗?

#include <iostream>
#include <utility>

struct S {
    // Imagine that this is a very complex class.
    int data1, data2, data3;
};

// Duplicated code for defining default parameter and the constexpr.
// This example is trivial, but remember that S is more complex in a real use case.
constexpr S defaultS = {0, 0, 1};
void test1(const S&& arg = S{0, 0, 1}) {
    std::cout << arg.data1 + arg.data2 + arg.data3 << std::endl;
}

// Default values are defined only once when defining defaultS.
// Will defaultS be unspecified after first call?
void test2(const S&& arg = std::move(defaultS)) {
    std::cout << arg.data1 + arg.data2 + arg.data3 << std::endl;
}

int main(int argc, char **argv) {
    // Use case for defaultS.
    // Most values are default but a few are changed.
    auto param = defaultS;
    param.data3 = 2;
    test1(std::move(param));

    test2(); // defaultS is moved from.
    test2(); // defaultS is used again here. Is it unspecified?
             // and will there therefore be undefined behaviour?

    return 0;
}
迪特玛·库尔(DietmarKühl)

由于std::move(defaultS)推导参数类型为asS const&并返回a typename std::remove_reference<S const&>::type&&,即a,S const&&我认为代码是可以的:您将无法从S const&&as对象移出const

S const&&我认为,将其作为论点没有多大意义当您想使用S&&as参数时,您需要创建一个对象,例如使用

void foo(S&& value = S(defaultS)) { ... }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用命名变量为const rvalue引用参数定义默认值?

来自分类Dev

如何记录为参数默认值

来自分类Dev

如何使用“使用命名空间”在命名空间中定义变量?

来自分类Dev

Scala 集合的元素可以使用命名参数和默认值构造同级实例?

来自分类Dev

Jinja2如果定义了变量,则来自Ansible默认值的设置变量会引用变量

来自分类Dev

PHP变量范围:通过引用将默认值的参数传递给匿名函数?

来自分类Dev

保留嵌套命名参数的默认值

来自分类Dev

const参考参数的默认值

来自分类Dev

如何访问函数参数的默认值?

来自分类Dev

使用默认值反应路线参数

来自分类Dev

Django自定义管理命令-为参数添加默认值

来自分类Dev

Scala:如何在部分函数中定义具有默认值的参数

来自分类Dev

如何在AngularJS UI-Router中定义查询参数的默认值?

来自分类Dev

Scala:如何在部分函数中定义具有默认值的参数

来自分类Dev

Scala:如何在伴随对象中定义构造函数参数的默认值?

来自分类Dev

是否可以在Java中使用默认值定义方法参数?

来自分类Dev

是否可以在Java中使用默认值定义方法参数?

来自分类Dev

如何获得方法的命名参数的默认值?

来自分类Dev

以其他参数为默认值的函数参数

来自分类Dev

如果参数为null,则使用默认值

来自分类Dev

如何将参数的默认值从一个函数定义传递给更高的函数定义

来自分类Dev

如何将参数的默认值从一个函数定义传递给更高的函数定义

来自分类Dev

函数参数的默认值,其中传入的值为nil

来自分类Dev

可选功能参数,默认值为参考值

来自分类Dev

如何以正确的参数类型返回参数的默认值?

来自分类Dev

如何使用GSON设置未公开参数的默认值

来自分类Dev

如何使用表达式作为参数默认值?

来自分类Dev

groovy中具有默认值的命名参数

来自分类Dev

Settin python中命名参数的常规默认值

Related 相关文章

  1. 1

    如何使用命名变量为const rvalue引用参数定义默认值?

  2. 2

    如何记录为参数默认值

  3. 3

    如何使用“使用命名空间”在命名空间中定义变量?

  4. 4

    Scala 集合的元素可以使用命名参数和默认值构造同级实例?

  5. 5

    Jinja2如果定义了变量,则来自Ansible默认值的设置变量会引用变量

  6. 6

    PHP变量范围:通过引用将默认值的参数传递给匿名函数?

  7. 7

    保留嵌套命名参数的默认值

  8. 8

    const参考参数的默认值

  9. 9

    如何访问函数参数的默认值?

  10. 10

    使用默认值反应路线参数

  11. 11

    Django自定义管理命令-为参数添加默认值

  12. 12

    Scala:如何在部分函数中定义具有默认值的参数

  13. 13

    如何在AngularJS UI-Router中定义查询参数的默认值?

  14. 14

    Scala:如何在部分函数中定义具有默认值的参数

  15. 15

    Scala:如何在伴随对象中定义构造函数参数的默认值?

  16. 16

    是否可以在Java中使用默认值定义方法参数?

  17. 17

    是否可以在Java中使用默认值定义方法参数?

  18. 18

    如何获得方法的命名参数的默认值?

  19. 19

    以其他参数为默认值的函数参数

  20. 20

    如果参数为null,则使用默认值

  21. 21

    如何将参数的默认值从一个函数定义传递给更高的函数定义

  22. 22

    如何将参数的默认值从一个函数定义传递给更高的函数定义

  23. 23

    函数参数的默认值,其中传入的值为nil

  24. 24

    可选功能参数,默认值为参考值

  25. 25

    如何以正确的参数类型返回参数的默认值?

  26. 26

    如何使用GSON设置未公开参数的默认值

  27. 27

    如何使用表达式作为参数默认值?

  28. 28

    groovy中具有默认值的命名参数

  29. 29

    Settin python中命名参数的常规默认值

热门标签

归档