为什么这不起作用?
struct O {
O(int i, int j)
: i(i)
, j(j)
{}
int const i;
int const j;
};
int main(int argc, char** argv)
{
boost::optional<O> i;
i.reset(O(4, 5));
return 0;
}
它似乎试图使用赋值运算符而不是尝试在适当的位置构造它。我原以为它会在未初始化的内存上调用O的复制构造函数。
/..../include/boost/optional/optional.hpp:433:69: error: use of deleted function ‘O& O::operator=(const O&)’
.... error: ‘O& O::operator=(const O&)’ is implicitly deleted because the default definition would be ill-formed:
.... error: non-static const member ‘const int O::i’, can’t use default assignment operator
.... error: non-static const member ‘const int O::j’, can’t use default assignment operator
答案 0 :(得分:1)
Boost.Optional使用赋值或复制构造,具体取决于i
的状态。由于此状态是运行时信息,因此必须在运行时进行分配和复制构造之间的选择
但是,这意味着编译器必须为两个选项生成代码,即使其中一个选项从未实际使用过。这意味着两种选择都必须是可能的。
要使代码正常工作,您可以向class O
添加一个(总是失败的)辅助运算符:
O& O::operator=(const O&)
{
throw "this is not possible"
return *this;
}
作为旁注,Optional<T>::reset
已弃用。您应该使用assingment,如
i = O(4,5);
上述语义对两者都有效。