我需要创建一个 std::tuple<const XYZ,...>
其中 XYZ 不可复制。这样的事情甚至可能吗?我当前的代码
auto test() -> std::tuple<const XYZ> { return std::make_tuple(XYZ()); }
在 Visual Studio 2010 中导致 C2248...我发现这很可疑,因为我正在构建具有 R 值的元组,所以我假设移动构造会启动...
最佳答案
您的问题是该元素既不可复制又 const
. const XYZ
元素表现为 const XYZ
成员;通过 5.2.5p4 访问 const XYZ
xvalue 上的元素将产生具有 union cv 资格的 xvalue,即具有有效类型 const XYZ &&
.该类型不适合作为 XYZ
的移动构造函数的参数因此将尝试调用已删除/私有(private)的复制构造函数。
另一种看待它的方式是移动构造函数(例如 std::tuple<...>
的移动构造函数)必须确保其参数处于未指定但有效的状态。通过制作元素 const
您已经说过该元素的唯一有效状态是构造它的状态,因此不允许移动构造函数从它移动,即使它包含在 xvalue 中。
解决方法是定义一个const move 构造函数和const_cast
它委托(delegate)给移动构造函数的参数:
XYZ(const XYZ &&xyz): XYZ(const_cast<XYZ &&>(xyz)) {}
有趣的是,在 gcc-4.7.2 中,只需声明 const 移动构造函数就足够了;通过 RVO,可以省略对 const 移动构造函数的实际调用。不要依赖这个。
关于c++ - 具有 const 不可复制元素的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735180/