无法找到保证 return 价值优化工作的方法
can't find a way to make garanteed return value optimization work
为什么当我删除移动构造函数时,Block<Tuple>::a1()
的调用中 clang 说 call to deleted constructor of 'Block<Tuple>::Self' (aka 'Block<Tuple>')
?
c++17
clang 版本 9.0.0 (tags/RELEASE_900/final)
目标:x86_64-pc-linux-gnu
线程模型:posix
安装目录:/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 并且代码无法编译的情况下抱怨。例如,当我删除复制构造函数并定义 move 时只抛出一个错误,他实际上优化了 a1 的调用,因为我没有得到任何错误。但是当我删除移动构造函数时,代码甚至无法编译。
此代码:
static Self a1() {
Self block;
return block;
}
不属于所谓的"guaranteed copy elision"。它仍然具有与旧版本的 C++ 相同的行为,即它是一个复制省略上下文,但 copy/move 构造必须有效并且编译器不必执行省略。
a2
代码本身就是 "guaranteed",你不应该从中得到错误。
为什么当我删除移动构造函数时,Block<Tuple>::a1()
的调用中 clang 说 call to deleted constructor of 'Block<Tuple>::Self' (aka 'Block<Tuple>')
?
c++17 clang 版本 9.0.0 (tags/RELEASE_900/final) 目标:x86_64-pc-linux-gnu 线程模型:posix 安装目录:/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 并且代码无法编译的情况下抱怨。例如,当我删除复制构造函数并定义 move 时只抛出一个错误,他实际上优化了 a1 的调用,因为我没有得到任何错误。但是当我删除移动构造函数时,代码甚至无法编译。
此代码:
static Self a1() {
Self block;
return block;
}
不属于所谓的"guaranteed copy elision"。它仍然具有与旧版本的 C++ 相同的行为,即它是一个复制省略上下文,但 copy/move 构造必须有效并且编译器不必执行省略。
a2
代码本身就是 "guaranteed",你不应该从中得到错误。