如何创建包含带引用参数的构造函数的 类 数组?

How to create array of classes containing a constructor with reference argument?

我有下面的一段代码,它给了我以下错误:

test.cpp:15:38: error: could not convert ‘std::ref<boost::asio::io_context>(((container*)this)->container::ioCtxt)’ from ‘std::reference_wrapper<boost::asio::io_context>’ to ‘A’
   15 |     std::array<A,2> bObjs = {std::ref(this->ioCtxt), nullptr};
      |                              ~~~~~~~~^~~~~~~~~~~~~~
      |                                      |
      |                                      std::reference_wrapper<boost::asio::io_context>
test.cpp:15:61: error: could not convert ‘nullptr’ from ‘std::nullptr_t’ to ‘A’
   15 |     std::array<A,2> bObjs = {std::ref(this->ioCtxt), nullptr};
      |                                                             ^
      |                                                             |
      |       

这是产生相关错误的最少代码。这段最小的代码是对更复杂情况的简单表示。

#include <boost/asio.hpp>


struct A
{
    boost::asio::ip::tcp::socket sock;
    A(boost::asio::io_context& ioCtxtFromContainer): sock(ioCtxtFromContainer){}
};

struct container
{
    boost::asio::io_service ioCtxt;

    std::array<A,2> bObjs = {std::ref(this->ioCtxt), nullptr};
};

int main(void)
{
    container containerObj;

    return 0;
}

将引用传递给 A 的构造函数的正确方法是什么? allowed/possible 此处不使用向量或其他形式的动态内存分配。

如果您需要明确的空字段,请存储可选数组。

#include <iostream>
#include <optional>
#include <array>


auto main() -> int
{
    std::array<std::optional<double>, 3> x {3.2, std::nullopt, 5.0};
    return 0;
}

编辑: 或 C++17 之前的版本

#include <iostream>
#include <array>
#include <boost/asio.hpp>
#include <boost/optional.hpp>


struct A
{
    boost::asio::ip::tcp::socket sock;
    A(boost::asio::io_context& ioCtxtFromContainer): sock(ioCtxtFromContainer){}
};

struct container
{
    boost::asio::io_service ioCtxt;

    std::array<boost::optional<A>,2> bObjs = {
        A{this->ioCtxt}, boost::none};
};

auto main() -> int
{
    container containerObj;
    return 0;
}

https://godbolt.org/z/f9fhr5dnK

  1. Conmpiler 无法通过初始化列表进行隐式转换:
#include <functional>
#include <array>

struct from{};

struct a
{
    a(from&){}
};

int main()
{
    from arg{};
    // std::array<a, 1> ar{std::ref(arg)}; // can't deduce from initializer list
    std::array<a, 1> ar{ arg }; // alright
    std::array<a, 1> ar2{ a(arg) }; // also alright
}
  1. 您希望如何从需要引用的指针初始化某些东西?
A(boost::asio::io_context& ioCtxtFromContainer):

您存储了一个 对象数组 ,而不是一个指针数组。因此,要么为 A 提供一个构造函数,它接受一个指针(这不是你明显想要的),要么有一个指针数组:std::array<A*, 2>(最好使用智能指针)。
或者您可以使用 std::optional,就像 alanger 所建议的那样。


您可以使用可变参数模板包装数组的初始化列表:

template <typename ... Args>
std::array<a, sizeof...(Args)> init_array(Args &&... args)
{
    return {a(std::forward<Args>(args))...};
}
    
from arg{};
auto ar3 = init_array(arg, std::ref(arg)); // works