大佬教程收集整理的这篇文章主要介绍了c – const_cast类构造函数中的const成员,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
struct qqq { const vector<foo> my_foo; qqq(vector<foo>* other) { vector<foo>& mutable_foo = const_cast<vector<foo>&>(my_foo) other->swap(mutable_foo); } };
我曾经假设在构造函数中执行此操作基本上没问题,因为此时没有其他人依赖它,因此它不会与优化等交互不良.
然而,最近有人告诉我这是“未定义的行为”,并且在任何情况下构造const对象之后改变const对象基本上是非法的.
有人可以澄清吗?这是一个不好/未定义的行为/事情吗?
在这种情况下,您似乎希望您的对象在构造后“变得”不变.这是不可能的.
如果你的向量是const,你应该在构造函数的initialization list中初始化它:
qqq(vector<foo>& other) : my_foo(std::move(other)) // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ { }
请注意,除非你有充分的理由通过指针传递 – 在这种情况下,你还应该检查指针是否为非空 – 你应该考虑通过引用传递(如上所示),这是常见的做法.
更新:
正如Pete Becker在评论中正确指出的那样,正确的设计会表明从vector参数移动的决定应该属于qqq构造函数的调用者,而不是构造函数本身.
如果构造函数总是应该从它的参数移开,那么你可以让它接受一个右值引用,清楚地表明构造函数本身对调用者的期望是什么:
qqq(vector<foo>&& other) // ^^ : my_foo(std::move(other)) // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ { }
这样,调用者必须在qqq的构造函数的输入中提供rvalue:
std::vector<foo> v; // ... qqq q1(v); // ERROR! qqq q2(std::move(v)); // OK! Now the client is aware that v must be moved from
以上是大佬教程为你收集整理的c – const_cast类构造函数中的const成员全部内容,希望文章能够帮你解决c – const_cast类构造函数中的const成员所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。