在不调用initializer_list构造函数的情况下,将不可复制,不可移动的类型构造为函数参数

戴维·斯通
#include <initializer_list>
#include <iostream>

namespace {

class C {
public:
    C(C const &) = delete;
    C(C &&) = delete;
    C(int) {
        std::cout << "int\n";
    }
    C(std::initializer_list<int>) {
        std::cout << "initializer\n";
    }
};

void f(C) {
}

// Compiles and prints "initializer" when called
C g() { return {0}; }
// Fails to compile
// C h() { return 0; }

}   // namespace

int main() {
    // Compiles and prints "initializer"
    f({0});
    // Fails to compile
    // f(0);
}

是否可以在不调用initializer_list构造函数的情况下,将C(不可复制,不可移动的类型)构造为函数参数或函数返回值?

乔纳森·韦克利

仅当可以更改时才可能,C因此可以选择所需的构造函数,而不是初始化列表构造函数,例如,通过将参数类型包装在不能转换为初始化列表构造函数的元素类型的东西中:

#include <initializer_list>
#include <iostream>

namespace {

template<class T>
struct wrap
{
  T value;
};

class C {
public:
    C(C const &) = delete;
    C(C &&) = delete;
    C(wrap<int>) {
        std::cout << "int\n";
    }
    C(std::initializer_list<int>) {
        std::cout << "initializer\n";
    }
};

void f(C) {
}

// Compiles and prints "int" when called
C g() { return {wrap<int>{0}}; }

}   // namespace

int main() {
    // Compiles and prints "int"
    f({wrap<int>{0}});
    g();
}

打印:

int
int

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++复制构造函数被调用而不是initializer_list <>

来自分类Dev

关于在不调用复制构造函数的情况下返回STL容器数据成员

来自分类Dev

在缺少移动构造函数的情况下,复制构造函数称为?这是为什么?

来自分类Dev

在缺少移动构造函数的情况下,复制构造函数称为?这是为什么?

来自分类Dev

在没有复制删除的情况下,是否可以确保在析构函数之前调用复制/移动构造函数?

来自分类Dev

为什么在这种情况下不调用复制构造函数?

来自分类Dev

std :: initializer_list作为构造函数的模板参数

来自分类Dev

如何在不调用此类的构造函数的情况下创建该类的实例?

来自分类Dev

在不调用C ++构造函数的情况下实例化对象

来自分类Dev

在不调用C ++构造函数的情况下实例化对象

来自分类Dev

如何在不调用Java构造函数的情况下继承类

来自分类Dev

在不调用析构函数、复制或移动的情况下初始化(分配)内存

来自分类Dev

是否可以让“命名构造函数”返回私有构造的,不可移动的,不可复制的std :: optional <T>?

来自分类Dev

即使复制构造函数不可用,返回的仅移动类型也会编译

来自分类Dev

为什么不调用复制构造函数

来自分类Dev

在什么情况下会调用C ++复制构造函数?

来自分类Dev

默认情况下应调用Move构造函数

来自分类Dev

不可复制类型的std :: initializer_list替代

来自分类Dev

如何在不知道形式参数类型的情况下找到构造函数?

来自分类Dev

CTAD、initializer_list、非显式构造函数和函数调用

来自分类Dev

嵌套列表初始化与以initializer_list为第二个参数的构造函数不匹配

来自分类Dev

默认情况下,案例类构造函数参数是否为公共val字段?

来自分类Dev

为什么调用复制构造函数而不是移动构造函数?

来自分类Dev

为什么调用复制构造函数而不是移动构造函数?

来自分类Dev

移动构造函数不调用析构函数?

来自分类Dev

为什么在函数返回时不调用复制构造函数?

来自分类Dev

在构造函数具有非空参数列表的情况下使用构造函数引用

来自分类Dev

复制或移动具有成员std :: mutex(或其他不可复制对象)的类的构造函数?

来自分类Dev

如何在不调用函数参数的情况下将其添加到函数参数

Related 相关文章

  1. 1

    C ++复制构造函数被调用而不是initializer_list <>

  2. 2

    关于在不调用复制构造函数的情况下返回STL容器数据成员

  3. 3

    在缺少移动构造函数的情况下,复制构造函数称为?这是为什么?

  4. 4

    在缺少移动构造函数的情况下,复制构造函数称为?这是为什么?

  5. 5

    在没有复制删除的情况下,是否可以确保在析构函数之前调用复制/移动构造函数?

  6. 6

    为什么在这种情况下不调用复制构造函数?

  7. 7

    std :: initializer_list作为构造函数的模板参数

  8. 8

    如何在不调用此类的构造函数的情况下创建该类的实例?

  9. 9

    在不调用C ++构造函数的情况下实例化对象

  10. 10

    在不调用C ++构造函数的情况下实例化对象

  11. 11

    如何在不调用Java构造函数的情况下继承类

  12. 12

    在不调用析构函数、复制或移动的情况下初始化(分配)内存

  13. 13

    是否可以让“命名构造函数”返回私有构造的,不可移动的,不可复制的std :: optional <T>?

  14. 14

    即使复制构造函数不可用,返回的仅移动类型也会编译

  15. 15

    为什么不调用复制构造函数

  16. 16

    在什么情况下会调用C ++复制构造函数?

  17. 17

    默认情况下应调用Move构造函数

  18. 18

    不可复制类型的std :: initializer_list替代

  19. 19

    如何在不知道形式参数类型的情况下找到构造函数?

  20. 20

    CTAD、initializer_list、非显式构造函数和函数调用

  21. 21

    嵌套列表初始化与以initializer_list为第二个参数的构造函数不匹配

  22. 22

    默认情况下,案例类构造函数参数是否为公共val字段?

  23. 23

    为什么调用复制构造函数而不是移动构造函数?

  24. 24

    为什么调用复制构造函数而不是移动构造函数?

  25. 25

    移动构造函数不调用析构函数?

  26. 26

    为什么在函数返回时不调用复制构造函数?

  27. 27

    在构造函数具有非空参数列表的情况下使用构造函数引用

  28. 28

    复制或移动具有成员std :: mutex(或其他不可复制对象)的类的构造函数?

  29. 29

    如何在不调用函数参数的情况下将其添加到函数参数

热门标签

归档