我有一个没有复制构造函数的类,我仍然想按值返回它。下面的MCVE在C++17中编译:
class Cls {
public:
Cls(int x) {}
Cls(const Cls& c) = delete;
};
Cls f(int x) {
return Cls(x);
}
int main() {
f(0);
}但在C++11中并非如此:
$ g++ prog.cc -Wall -Wextra -std=c++11
prog.cc: In function 'Cls f(int)':
prog.cc:9:17: error: use of deleted function 'Cls::Cls(const Cls&)'
9 | return Cls(x);
| ^
prog.cc:5:5: note: declared here
5 | Cls(const Cls& c) = delete;
| ^~~据我所知,原因是编译器不允许优化复制,即使在这种情况下它应该是微不足道的。
我希望return std::move(Cls(x));能够工作,并避免复制构造函数,但它也会产生同样的错误。
我可以在不定义复制构造函数(或辅助操作符)的情况下修复这个问题吗?
我看过相关的问题,但找不到副本。
发布于 2019-02-01 09:13:11
发布于 2019-02-01 10:08:49
我可以在不定义复制构造函数(或辅助操作符)的情况下修复这个问题吗?
在您的案例中有两种选择:
在C++17中,您有“保证”复制(或“非物化值传递”),因此return Cls(x);是可以的。
https://stackoverflow.com/questions/54476215
复制相似问题