Избегайте вызова конструктора по умолчанию, перемещайте и копируйте - PullRequest
0 голосов
/ 19 ноября 2018

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

#include <cstdint>

class Interface
{
public:
   Interface() = default;
   virtual ~Interface() = default;
   Interface(const Interface&) = delete;
   Interface(Interface&&) = delete;
   const Interface& operator=(const Interface&) = delete;
   Interface& operator=(Interface&&) = delete;
};

class FooC : public Interface
{
public:
   FooC(uint16_t iPort, uint16_t iPin)
   : PORT(iPort)
   , PIN(iPin)
   {
   };

   FooC() = delete;
   ~FooC() override = default;
   FooC(const FooC&) = delete;
   FooC(FooC&&) = delete;
   const FooC& operator=(const FooC&) = delete;
   FooC& operator=(FooC&&) = delete;

private:
   const uint16_t PORT;
   const uint16_t PIN;
};

class FactoryC
{
public:
   FactoryC()
   : mFoo{
     {1, 2},
     {3, 4}
   }
   {
   };

   ~FactoryC() = default;
   FactoryC(const FactoryC&) = delete;
   FactoryC(FactoryC&&) = delete;
   const FactoryC& operator=(const FactoryC&) = delete;
   FactoryC& operator=(FactoryC&&) = delete;

private:
   FooC mFoo[2];
};

int main()
{
    FactoryC factory{};
}

и я не хочу вызывать конструктор по умолчанию, перемещать и копировать. В связи с этим я удалил функции. К сожалению, это приводит к следующей ошибке (скомпилировано с C ++ 17)

<source>: In constructor 'FactoryC::FactoryC()':

<source>:42:4: error: use of deleted function 'FooC::FooC(FooC&&)'

    }

    ^

<source>:26:4: note: declared here

    FooC(FooC&&) = delete;

    ^~~~

Compiler returned: 1

Можно ли в этом примере принудительно вызвать конструктор с параметрами и при этом удалить конструктор по умолчанию, перемещение и копирование FooC?

1 Ответ

0 голосов
/ 20 ноября 2018

Это похоже на ошибку.@ Комментарий Сергея:

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

предполагает, что проблема связана с виртуальными базовыми классами.Действительно, сообщение об ошибке # 86849 имеет дело с не связанной проблемой, и Ричард Смит приходит к такому выводу:

Интересно, что GCC, по-видимому, подавляет гарантированное исключение копирования, если класс имеет виртуальную базуклассы.

...