c++ - 具有 const 不可复制元素的元组

标签 c++ visual-c++ c++11 tuples visual-c++-2010

我需要创建一个 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/

相关文章:

c++ - 从返回迭代器的 const 和非常量方法中删除代码重复

c++ - 如何循环 BSTR?

c++ - MSVC : what compiler switches affect the size of structs?

c++ - 为什么在启用浮点异常后我得到多个陷阱错误

c++ - ServerApplication 看不到具有相对路径的文件

c++ - 在 CLion (windows) 上构建 wxWidgets 3.0.3 程序

c++ - 一般处理文件流

c++ - 使用 QProcess 查询

c++ - C++ 中另一个带有闭包的抽象类问题

c++ - 一行输入多个变量