在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参
Constructing a non-copyable, non-movable type into a function parameter without invoking initializer_list constructor
#include <initializer_list>
#include <iostream>
namespace {
class C {
public:
C(C const &) = delete;
C(C &&) = delete;
C(int) {
std::cout << "intn";
}
C(std::initializer_list<int>) {
std::cout << "initializern";
}
};
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 << "intn";
}
C(std::initializer_list<int>) {
std::cout << "initializern";
}
};
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
相关文章:
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么协程的返回类型必须是可移动构造的?
- 我应该使我的局部变量常量还是可移动的
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 如何获取类型是否真正可移动可构造
- 可移动但不可复制的对象:按值传递还是按引用传递?
- 对于可移动类型,按值传递比重载函数更好吗?
- 使用参数将仅可移动对象捕获到 lambda
- 具有抑制移动构造/赋值的类型如何仍被视为可移动类型?
- 防止作用域枚举可复制/可移动
- 禁止可移动的QGraphics物品与其他物品发生冲突
- 为什么类型可转换性C++不传递
- 为什么 std::optional 不允许"move construct and copy assign only"类型的移动分配?
- 在向量中使用派生的可移动但不可压缩的会导致编译错误
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 在成员容器中复制具有仅可移动但可克隆类型的构造函数
- 构造函数中可移动类型的 C++ 右值
- 可移动类型的类型特征
- 对于可移动类型,删除std::向量中间的元素仍然很昂贵吗
- 这个可移动类型对于 std::map 有什么问题?