mingw — компилятор c ++, свободный выбор между пользовательским и сгенерированным компилятором конструкторами копирования?

У меня есть следующий пример кода (урезанная версия моей программы)

Класс ‘some_class’ имеет конструктор с параметрами по умолчанию. Компилятор может распознать этот конструктор как конструктор копирования. В основной функции этот конструктор вызывается, когда я заказываю для объекта, сконструированного с копией, называемого ‘b’. Но когда я конструирую ‘c’ из результата функции, компилятор вызывает сгенерированный компилятором конструктор копирования (который копирует битовый шаблон). Я могу сказать по значению c.some_data, которое должен был быть установлен моим собственным конструктором копирования в значение 2.

1) Что стандарт говорит об этом?
2) Мой компилятор сломан?

Я использую MinGW без параметров, кроме как с указанием имени моего исходного файла и имени исполняемого файла. Я получил свой порт компилятора с открытым исходным кодом GNU с официального сайта MinGW, я использую последнюю версию. Нашел ли я ошибку, или это из-за моего (неправильного) понимания c ++?

заранее спасибо

#include <iostream>
#include <string>

class some_class
{
public:
some_class(int p = 0) :
some_data(p)
{
std::cout << "user defined constructor (p = " << p << ")" << std::endl;
}
some_class(const some_class &, int = 0)
{
std::cout << "user defined copy constructor" << std::endl;

some_data = 2;
}

int some_data;
};

extern some_class some_function_returning_some_class_object();

int main(int, char **)
{
std::cout << "creating a, with no parameters" << std::endl;
some_class a;
std::cout << "creating b, a copy of a" << std::endl;
some_class b = a;
std::cout << "creating c, copy constructed from a function result" << std::endl;
some_class c = some_function_returning_some_class_object();
std::cout << "c.some_data = " << c.some_data << std::endl;
}

some_class some_function_returning_some_class_object()
{
some_class a(1);

return a;
}

Вывод следующий:

creating a, with no parameters
user defined constructor (p = 0)
creating b, a copy of a
user defined copy constructor
creating c, copy constructed from a function result
user defined constructor (p = 1)
c.some_data = 1

1

Решение

Компилятор не использует определяемый компилятором конструктор копирования по умолчанию. Предположительно использует оптимизация возвращаемого значения пропустить копию в целом.

4

Другие решения

Других решений пока нет …