首页 > 解决方案 > 避免调用移动构造函数

问题描述

我有以下示例

#include <cstdint>

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

   ~FooC() = default;

   FooC() = delete;
   FooC(const FooC&) = delete;
   FooC(FooC&&) = delete;

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

int main()
{
    FooC array[2] = {
       FooC(1,2),
       FooC(3,4)
    };
}

而且我不想调用默认、移动和复制构造函数。因此,我删除了这些功能。不幸的是,这会导致以下错误(使用 C++11 编译)

:在函数'int main()'中:

:28:5: 错误:使用已删除的函数 'FooC::FooC(FooC&&)'

 };

 ^

:16:4: 注意:在这里声明

FooC(FooC&&) = delete;

^~~~

:28:5: 错误:使用已删除的函数 'FooC::FooC(FooC&&)'

 };

 ^

:16:4: 注意:在这里声明

FooC(FooC&&) = delete;

^~~~

编译器返回:1

是否可以在此示例中强制使用参数调用构造函数,但仍删除默认、移动和复制构造函数?

标签: c++c++11c++17

解决方案


在 C++11 和 C++14 中,您可以使用嵌套大括号:

FooC array[2] = {{1,2}, {3,4}};

在 C++17 中,由于新的纯右值/实现规则(“保证复制省略”),您的代码应该已经可以正常工作了。


推荐阅读