gpt4 book ai didi

c++ - 为什么我们需要 base-to-member 习语?

转载 作者:行者123 更新时间:2023-11-30 00:49:43 25 4
gpt4 key购买 nike

我熟悉 base-to-member 的习语,它的经典例子:

#include <streambuf>  // for std::streambuf
#include <ostream> // for std::ostream

namespace std {
class streambuf;
class ostream {
explicit ostream(std::streambuf * buf);
//...
};
}
class fdoutbuf // A customization of streambuf
: public std::streambuf
{
public:
explicit fdoutbuf( int fd );
//...
};

class fdostream
: public std::ostream
{
protected:
fdoutbuf buf;
public:
explicit fdostream( int fd )
: buf( fd ), std::ostream( &buf )
// This is not allowed: buf can't be initialized before std::ostream.
// std::ostream needs a std::streambuf object defined inside fdoutbuf.
{}
};

我一直认为不能在构造函数中获取 buf 地址的规则是 C++ 规范的一部分。我最近开始了一个项目,在类似的情况下做一些类似于 &buf 的事情。我想将它们指向 C++ 规范以将其显示为未定义的行为,但我的搜索即将枯竭。

这是否可能实际上是合法的,只是不受欢迎?或者有人可以向我引用规范中的部分,我可以将这些部分带给团队的其他成员并确定如何处理吗?

相关工单,this pointer to base class constructor涵盖了将 this 指针传递给基类的情况,但这似乎由规范的不同部分处理,例如 12.7.3

最佳答案

获取尚未初始化的成员、基或局部变量的地址是完全合法的。如果您开始尝试读取或写入该指针,就会发生坏事。如果您只是在初始化后存储指针供以后使用,那是完全合法的。

关于c++ - 为什么我们需要 base-to-member 习语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431412/

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