C++ 针对差劲C+的解决方案+;“英特尔13.1.2”中删除复制构造函数的行为

C++ 针对差劲C+的解决方案+;“英特尔13.1.2”中删除复制构造函数的行为,c++,c++11,C++,C++11,我一直支持Intel 13.1.2,它名义上符合C++11,但以下代码: #include <algorithm> struct moveonly { moveonly() =default; moveonly(const moveonly&) =delete; moveonly(moveonly&& other) { member = std::move(other.member); } private: i

我一直支持Intel 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;
}

假设我无法使类可复制,并且希望保留转换运算符,有人能想出解决方法吗?

您可以尝试使右值显式:

moveonly a = std::move(m);
可能,显式强制转换也有帮助:

moveonly a = static_cast<moveonly&&>(m);
如果全部失败,返回到C++11之前的版本意味着:

struct holds
{
    operator T&&() { return std::move(t); }
    T t;
    swap(T& tt)
    {
        swap(t, tt);
    }
};
通过为moveonly定义适当的交换,您可以:

moveonly a;
m.swap(a);

但是我通过转换操作符有一个右值引用(注意,这在gcc上编译得很好)。在任何情况下,std::move(m)都会生成相同的错误。@SeanMcAllister,这个答案,如果有效,满足您的要求:这将是一个解决办法,您可以避免复制,但保留转换。我对无效的下一票感到惊讶。不幸的是,这两种方法都不起作用,静态类型转换会产生无效的类型转换错误。我想在不可复制的情况下,我只能使用显式的成员函数::value()。。。调整后,添加了一些进一步的选项。英特尔13从来都不是C++11。他们可能说过这样的话,但这是一厢情愿的想法。@Walter说真的……是吗?我是认真的。我放弃了英特尔编译器,因为它的C++标准不到5岁。抱歉,音调丢失了,我同意你的看法,这太糟糕了,但我现在就坚持了。
struct holds
{
    operator T&&() { return std::move(t); }
    T t;
    swap(T& tt)
    {
        swap(t, tt);
    }
};
moveonly a;
m.swap(a);