gpt4 book ai didi

c++ - boost::optional with const 成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:20 26 4
gpt4 key购买 nike

为什么这行不通?

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

最佳答案

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);

上述语义对两者都有效。

关于c++ - boost::optional with const 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14374802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com