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

标签 c++ c++11 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

关于c++ - 在不调用 initializer_list 构造函数的情况下将不可复制、不可移动的类型构造为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22621786/

相关文章:

c++ - 使用 C++11 的成员初始化列表中的初始化列表语法

c++ - 如何 move initializer_list 的元素?

c++ - 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么?

c++ - 函数参数的析构函数在 gcc 和 MSVC 中被不同地调用

c++ - 使用标准 C++ fstream 在串行设备 (/dev/ttyGS0) 上读写?

c++ - 外部模板类和非模板友元函数

c++ - QtConcurrency::mapped 成员函数

c++ - 带转发的initializer_list 的模板参数推导

c++ - 有必要声明函数原型(prototype)吗?

c++ - C++ 整数除法如何用于限制和负值?