gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:20 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com