避免调用move构造函数

ge4*_*mue 13 c++ c++11 c++17

我有以下例子

#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)
    };
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

 };

 ^
Run Code Online (Sandbox Code Playgroud)

:16:4:注意:在这里宣布

FooC(FooC&&) = delete;

^~~~
Run Code Online (Sandbox Code Playgroud)

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

 };

 ^
Run Code Online (Sandbox Code Playgroud)

:16:4:注意:在这里宣布

FooC(FooC&&) = delete;

^~~~
Run Code Online (Sandbox Code Playgroud)

编译返回:1

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

Ker*_* SB 14

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

FooC array[2] = {{1,2}, {3,4}};
Run Code Online (Sandbox Code Playgroud)

在C++ 17中,由于新的prvalue/materialization规则("保证副本省略"),您的代码应该已经按照书面形式工作.


Nat*_*ica 5

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

不使用当前语法(在C++ 17之前)和是(在C++ 17中).

预C++ 17:

这是不可能的.聚合初始化将初始化器复制到聚合中.这意味着您必须具有可访问的复制/移动构造函数.在C++ 11中,您必须将构造函数参数作为自己的braced-init-list传递.这意味着你不是复制FooC的,而是复制列表初始化FooC数组中的s,它调用2参数构造函数而不是复制/移动构造函数.

FooC array[2] = {
   {1, 2},
   {3, 4}
};
Run Code Online (Sandbox Code Playgroud)

C++ 17:

您不再在braced-init-list中拥有临时对象,并且将直接初始化该数组的每个元素而不是复制初始化.