我熟悉基地对成员的习语,以及它的经典例子:
#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
答案 0 :(得分:6)
获取尚未初始化的成员,基本或局部变量的地址是完全合法的。如果你开始尝试读取或写入指针,那就会发生坏事。如果您只是存储指针以供以后在初始化后使用,那就完全合法了。