У меня есть следующий код:
#include <iostream>
class foo_class {
std::string value;
public:
foo_class(const foo_class& v) : value{v.value} {
std::cout << "copy constructor" << std::endl;
}
foo_class(foo_class&& v) : value{std::move(v.value)} {
std::cout << "move constructor" << std::endl;
}
~foo_class() {
std::cout << "destructor" << std::endl;
}
foo_class(std::string v) : value{std::move(v)} {
std::cout << "type constructor" << std::endl;
}
};
struct Data {
foo_class a;
foo_class b;
};
int main() {
std::string c = "3";
Data x{c,c+"3"};
return 0;
}
ВАЖНО, я компилирую его с помощью GCC и Clang (4.8.2 и 3.4 соответственно) и флага -fno-elide-constructors, поэтому мы не пропускаем копию/ перемещать конструкторы.
Результат выполнения следующий:
type constructor
move constructor
destructor
type constructor
move constructor
destructor
destructor
destructor
Это означает, что конструктор копирования вообще не используется, даже если его следует использовать для первого аргумента конструктора структуры Data.
Далее, если я удалю конструктор копирования, код по-прежнему будет законным в соответствии с моими компиляторами, но, по моему мнению, должен быть незаконным, потому что я не выполняю приведение к && (используя std::move) при передаче первого аргумента конструктора данных.
У меня простой вопрос: Почему это происходит? Я что-то упустил?
x
, хотя это то же самое, что и набор идеальных функций пересылки. Хотя у вас есть одна дополнительная копия в конструкторе типов. - person Mooing Duck   schedule 15.03.2018