在下列程式码中:
class Base
{
protected:
int v;
Base( void * ) { /* doesn't touch v at any point */ }
};
class Derived: public Base
{
public:
// Changes Base::v before calling Base::Base
Derived(): Base( ( (void )( v = 42 ), nullptr ) ) {}
};
Derived::Derived
在调用Base::Base
之前更改了POD成员变量Base::v
。已知Base::Base
根本没有接触v
。目标是在离开Derived::Derived
之后将Base::v
初始化为42
。
虽然这在技术上应该是可行的(当Derived::Derived
被调用时,Base::v
已经在内存中为它分配了空间,并且Base::Base
中的任何代码都不会触及它),但问题是,这合法吗?更具体地说,这是否意味着任何未定义的行为,而编译器通常喜欢优化掉这些行为?
请注意,这个问题纯粹是为语言律师准备的,我不是在问是否有更好的方法来做这件事(在大多数情况下显然是有的),我也不是在试图解决任何具体的问题,而是试图从C标准的Angular 来学习更多关于C的知识。
1条答案
按热度按时间nbysray51#
不,这是无效的:
class.cdtor/1
对于具有重要建构函式的对象,在建构函式开始执行之前指涉对象的任何非静态成员或基底类别会导致未定义的行为。
另请参见上一段下面的示例: