"非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"

`constructor required before non-static data member` - Am I hitting c++ core issue 1360 with a `boost::variant`?

本文关键字:quot 是否 boost variant 静态 数据成员 构造函数      更新时间:2023-10-16

使用此代码

#include <boost/variant.hpp>
#include <string>
struct Outer
{
struct StateA
{
std::size_t index = std::string::npos;
};
struct StateB {};
using State = boost::variant<StateA, StateB>;
struct Inner
{
State state = StateB{};
};
};
int main() {
Outer o;
(void)o;
}

我收到以下编译错误

/usr/include/boost/variant/variant.hpp:1301:17:   required from ‘class boost::variant<Outer::StateA, Outer::StateB>’
inner_class.cpp:18:30:   required from here
/usr/include/boost/type_traits/has_nothrow_constructor.hpp:27:84: error: constructor required before non-static data member for ‘Outer::StateA::index’ has been parsed
template <class T> struct has_nothrow_constructor : public integral_constant<bool, BOOST_HAS_NOTHROW_CONSTRUCTOR(T)>{};

提到这个问题,我似乎遇到了这个核心问题,但我想检查一下我的理解。

具体来说,我是否击中了

当前文本中未指定的顺序依赖关系

当我的varianttypedefInner中初始化时? 还是内部struct还有其他原因导致此编译错误?

这不依赖于(发现(constexpr任何东西,所以它与CWG1360不同,但它肯定是相似的,因为它利用了不可能同时让嵌套类成为其包含类的完整类上下文,并且嵌套类在包含类中比其定义更晚完成。 也许最好的轨迹是CWG2335,为此已经提出了一般(长期(建议,即类中的实际依赖关系应该通过类似实例化的机制进行跟踪;像你这样的例子要求跨班级进行这样的处理。