Я не могу понять, почему в последнем случае это конструктор перемещения , вызываемый при включенном разрешении копирования (или даже обязательном, например, в С++ 17):
class X {
public:
X(int i) { std::clog << "converting\n"; }
X(const X &) { std::clog << "copy\n"; }
X(X &&) { std::clog << "move\n"; }
};
template <typename T>
X make_X(T&& arg) {
return X(std::forward<T>(arg));
}
int main() {
auto x1 = make_X(1); // 1x converting ctor invoked
auto x2 = X(X(1)); // 1x converting ctor invoked
auto x3 = make_X(X(1)); // 1x converting and 1x move ctor invoked
}
Какие правила мешают конструктору перемещения в этом случае?
UPDATE
Возможно, более простые случаи, когда вызываются конструкторы перемещения:
X x4 = std::forward<X>(X(1));
X x5 = static_cast<X&&>(X(1));