如何创建包含带引用参数的构造函数的 类 数组?
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;
}
- 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
}
- 您希望如何从需要引用的指针初始化某些东西?
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
我有下面的一段代码,它给了我以下错误:
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;
}
- 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
}
- 您希望如何从需要引用的指针初始化某些东西?
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