为什么我们需要基地对成员的习语?

时间:2014-12-11 20:02:46

标签: c++ inheritance initialization

我熟悉基地对成员的习语,以及它的经典例子:

#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

1 个答案:

答案 0 :(得分:6)

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