У меня есть класс без конструктора копирования, который я все еще хочу вернуть по значению.Следующие 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));
сработает и избежит конструктора копирования, но он выдаст ту же ошибку.
Можно ли исправить проблему без определения конструктора копирования (или оператора присвоения)?
Я просмотрел похожие вопросы, но не смог найти дубликат.