删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
Workaround for poor C++ behavior in Intel 13.1.2 with deleted copy constructor
我坚持支持英特尔 13.1.2,它名义上符合 C++11,但这段代码:
#include <algorithm>
struct moveonly {
moveonly() =default;
moveonly(const moveonly&) =delete;
moveonly(moveonly&& other) { member = std::move(other.member); }
private:
int member = 0;
};
template <typename T>
struct holds {
operator T&&() { return std::move(t); }
T t;
};
int main() {
holds<moveonly> m;
moveonly a = m;
}
编译失败:
╰─▸ icc -std=c++11 test.cc -o test
test.cc(21): error: function "moveonly::moveonly(const moveonly &)" (declared at line 5) cannot be referenced -- it is a deleted function
moveonly a = m;
^
test.cc(21): error: function "moveonly::moveonly(const moveonly &)" (declared at line 5) cannot be referenced -- it is a deleted function
moveonly a = m;
^
compilation aborted for test.cc (code 2)
假设我无法使类可复制,并且想保留转换运算符,任何人都可以想出解决方法吗?
您可以尝试使右值显式:
moveonly a = std::move(m);
显式强制转换也可能有所帮助:
moveonly a = static_cast<moveonly&&>(m);
显式调用强制转换运算符:
moveonly a = m.operator moveonly&&();
如果全部失败,回退到 C++11 之前意味着:
struct holds
{
operator T&&() { return std::move(t); }
T t;
swap(T& tt)
{
swap(t, tt);
}
};
为Moveonly定义了适当的交换,因此您可以:
moveonly a;
m.swap(a);
相关文章:
- 为什么"using System;"不被视为不良做法?
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- 如果 constexpr 和依赖假static_assert形成不良?
- 不从成员函数C 存储返回值认为不良习惯
- shared_from__this,asio的不良弱ptr例外
- 试图初始化矩阵C 时的不良同种
- 创建以不良输出结束
- 检测`boost :: Math ::工具:: brent_find_minima()的不良输入
- C HTTP POST 400不良请求
- OPENCV错误:不良的参数(字节必须为16、32或64)在简介Descriptorextractorimpl中
- 与全球矢量的不良同种
- 限制C++中允许的模板参数是否被认为是不良样式?
- 从触摸回调访问向量元素的方法时,不良访问错误
- 不良指针和乱码的数据
- CGAL:Hausdorff距离不良Alloc
- 如果您的团队同意一组别名,则使用类型别名进行STL容器不良练习
- 异常的不良TypeInfo名称
- 400 Casablanca cpprestsdk的不良要求
- 是一个未删除的无限,而循环不良练习