Почему auto нельзя использовать для определения неявно удаленного конструктора

У меня есть этот небольшой фрагмент (скомпилированный с помощью g++), в котором я определил конструктор перемещения:

#include <iostream>
using namespace std;

class A {
public:
  A() = delete;
  A(int value) : value(value) {}
  void operator=(const auto &other) = delete;
  ~A() { cout << "Destructor called..." << endl; }

  A(const auto &other) {
    cout << "Copy constructor called..." << endl;
    value = other.value;
  }

  A(const A &&other) {
    cout << "Move constructor called..." << endl;
    value = other.value;
  }

private:
  int value;
};

int main() {
  A p1(2);
  A p2(p1);

  return 0;
}

Насколько я понимаю, существует соглашение компилятора о неявном удалении любых операций копирования при определении конструктора перемещения. Они должны быть явно определены, если они нужны пользователю.

Поскольку auto будет преобразован в A, по какой причине компилятор все еще считает этот конкретный конструктор удаленным?

Jason Liam 21.11.2022 06:05

273K 21.11.2022 06:07

«Поскольку auto будет преобразовано в A»: объявление «функции» с заполнителем (auto) в параметрах — это не функция, а шаблон функции. Это не разрешится просто A. Он будет принимать любой тип в качестве аргумента в конструкции. И, как говорится в ответе, шаблоны функций никогда не могут быть конструкторами копирования, так что все еще есть неявный, который удаляется и лучше соответствует разрешению перегрузки (потому что это не шаблон).

user17732522 21.11.2022 06:17
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
4
3
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Поскольку auto будет преобразовано в A, по какой причине компилятор все еще считает этот конкретный конструктор удаленным?

(выделено мной)



Другие вопросы по теме