Конструкторы variadic, как предполагается, скрывают неявно сгенерированные?

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

Вы не проверяли возвращаемое значение mmap() для значения MAP_FAILED ((void *) -1), а затем пытались получить доступ к этому недействительному адресу памяти.

27
задан Community 23 May 2017 в 10:28
поделиться

1 ответ

Объявление неявно объявленного конструктора копирования фактически не подавляется. Это просто не вызывается из-за правил разрешения перегрузки.

Неявно объявленный конструктор копирования имеет форму Foo(const Foo&). Важной частью этого является то, что требуется постоянная ссылка. Ваш шаблон конструктора использует неконстантную ссылку.

a не является константой, поэтому неконстантный объявленный пользователем шаблон конструктора предпочтительнее неявно объявленного конструктора копирования. Чтобы вызвать неявно объявленный конструктор копирования, вы можете сделать a const:

const Foo a;
Foo b(a);

или использовать static_cast для получения константной ссылки на a:

Foo a;
Foo b(static_cast<const Foo&>(a));

Правила разрешения перегрузки, описывающие это, находятся в основном в §13.3.3.2 / 3 FCD C ++ 0x. Этот конкретный сценарий, с комбинацией ссылок lvalue и rvalue, как бы описан различными примерами на стр. 303.


Шаблон конструктора переменных будет подавлять неявно объявленный конструктор по умолчанию, так как шаблон конструктора переменных объявлен пользователем, а неявно объявленный конструктор по умолчанию предоставляется только в том случае, если нет конструкторов, объявленных пользователем (C ++ 0x FCD § 12.1 / 5):

Если для класса X нет объявленного пользователем конструктора, конструктор, не имеющий параметров, неявно объявляется как дефолтный.

Шаблон конструктора с переменными параметрами не будет подавлять неявно объявленный конструктор копирования, поскольку только конструктор без шаблона может быть конструктором копирования (C ++ 0x FCD §12.8 / 2, 3 и 8):

Не шаблонный конструктор для класса X является конструктором копирования, если его первый параметр имеет тип X&, const X&, volatile X& или const volatile X&, и либо нет других параметров или все остальные параметры имеют аргументы по умолчанию.

Не шаблонный конструктор для класса X является конструктором перемещения, если его первый параметр имеет тип X&&, const X&&, volatile X&& или const volatile X&&, и либо нет других параметров, либо все остальные параметры имеют аргументы по умолчанию.

Если определение класса явно не объявляет конструктор копирования, и не существует объявленного пользователем конструктора перемещения, конструктор копирования неявно объявляется как дефолтный.

21
ответ дан James McNellis 28 November 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: