找不到使保证返回值优化工作的方法

马尔德

为什么在我删除移动构造函数时call to deleted constructor of 'Block<Tuple>::Self' (aka 'Block<Tuple>')的调用中会Block<Tuple>::a1()出现叮当声

c++17 clang version 9.0.0 (tags/RELEASE_900/final) 目标:x86_64-pc-linux-gnu 线程模型:posix InstalledDir:/usr/bin

template<typename tRecord>
struct Block {

    using Self = Block<tRecord>;

    Size mUsedBytes;
    bool mModified;

    union Data {
        char mBytes[4_KB];
        tRecord mRecord;
    };
    Data mData;

    Block() {
        mardCpp::Log::info("constructing");
    };

    Block(const Block &block) = delete;
    Block(Block &&block) = delete;

    static Self a1() {
        Self block;
        return block;
    }

    static Self a2() {
        return Self();
    }
};

从我读过的内容来看,如果我删除了复制和移动构造函数,我可以保证 rvo 。编译器会在无法执行 rvo 并且代码无法编译的情况下抱怨。例如,当我删除复制构造函数并定义仅抛出错误的移动时,他实际上优化了 a1 的调用,因为我没有错误。但是当我删除移动构造函数时,代码甚至无法编译。

毫米

这段代码:

static Self a1() {
    Self block;
    return block;
}

不是所谓的“保证复制省略”的一部分。它仍然具有与旧版本 C++ 相同的行为,即它是一个复制省略上下文,但复制/移动构造必须有效并且编译器不必执行省略。

a2代码是“有保证的”,您不应该从中得到错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章