Рассмотрим следующий код:
#include <vector>
class A
{
public:
A(A&&); // somewhat expensive
static std::vector<A> make_As()
{
std::vector<A> result;
result.push_back(A(3));
result.push_back(A(4));
return result;
}
private:
A(int); // private constructor
};
Поскольку конструктор перемещения A
несколько дорог (по какой-то причине), я бы хотел избежать его вызова и вместо этого использовать emplace_back()
:
#include <vector>
class A
{
public:
A(A&&); // somewhat expensive
static std::vector<A> make_As()
{
std::vector<A> result;
result.emplace_back(3);
result.emplace_back(4);
return result;
}
private:
A(int); // private constructor
};
К сожалению, с emplace_back()
фактический вызов конструктора выполняется чем-то в стандартной библиотеке, которая недостаточно привилегирована, чтобы иметь возможность вызывать частный конструктор A
.
Я понимаю, что с этим, вероятно, мало что можно сделать, но, тем не менее, я чувствую, что, поскольку вызовы emplace_back()
происходят внутри члена A
, они должны вызывать закрытый конструктор.
Есть ли обходные пути для этого?
Единственное, что я могу придумать, это добавить декларацию друга к A
, но точный класс, который должен быть другом A
(то есть класс, который фактически пытается вызвать конструктор), зависит от реализации (например, для GCC это __gnu_cxx::new_allocator<A>
). EDIT: только что понял, что такое объявление друга позволит любому создавать emplace_back()
A
с помощью частного конструктора в контейнер A
, так что на самом деле это ничего не решит, я может также сделать конструктор общедоступным в этот момент...
ОБНОВЛЕНИЕ: я должен добавить, что дороговизна конструктора перемещения A
— не единственная причина избегать его вызова. Возможно, A
вообще нельзя перемещать (или копировать). Конечно, это не сработает с vector
(поскольку emplace_back()
может потребоваться перераспределить вектор), но сработает с deque
, который также имеет аналогичный метод emplace_back()
, но не должен ничего перераспределять.
push_back
повлечет за собой стоимость частного конструктора + стоимость конструктора перемещения. Использованиеemplace_back
повлечет за собой только стоимость частного конструктора, поэтому это будет строго быстрее. - person HighCommander4   schedule 11.07.2012A
несколько дорог (по какой-то причине), вероятно, это не должно вызывать беспокойства. - person GManNickG   schedule 11.07.2012vector
наdeque
- это был бы правдоподобный сценарий). Я отредактирую ответ, чтобы упомянуть об этом. - person HighCommander4   schedule 11.07.2012std::array
. - person HighCommander4   schedule 11.07.2012