gpt4 book ai didi

c++ - 是否修改 const 对象的内部字节未定义行为,以防它包含由放置 new 构造的另一个对象?

转载 作者:行者123 更新时间:2023-12-03 06:49:37 25 4
gpt4 key购买 nike

考虑以下示例:

#include <new>

struct FunctionObject
{
int operator()() // non-const, modifies the state of this object
{
i += 1;
j += 2;
return i + j;
}

int i = 0;
int j = 0;
};

struct Wrapper
{
explicit Wrapper(const FunctionObject& input_object)
{
constructed_object = ::new (buffer) FunctionObject(input_object);
}

~Wrapper()
{
constructed_object->~FunctionObject();
}

int operator()() const // const, but invokes the non-const operator() of the internal FunctionObject
{
return (*constructed_object)(); // this call modifies the internal bytes of this Wrapper
}

alignas(FunctionObject) unsigned char buffer[sizeof(FunctionObject)];
FunctionObject* constructed_object = nullptr;
};

int test()
{
const FunctionObject function_object{3, 4};
const Wrapper object_wrapper{function_object}; // this call modifies the internal bytes of a const Wrapper
return object_wrapper();
}
一个 Wrapper包含一个内部 FunctionObject这是在 Wrapper 内部构建的通过新的展示位置。 Wrapper对象是 const ,其 operator()也是 const ,但调用它会导致对象的内部状态被修改。在许多情况下,类似的场景是 C++ 中的未定义行为。
问题是,在这种特殊情况下是未定义的行为(~我是否需要将 buffer 标记为 mutable ?),还是 C++ 标准允许编写这样的代码?

最佳答案

这是未定义的行为。
来自 [dcl.type.cv],

Any attempt to modify a const object during its lifetime results inundefined behavior.


添加 mutable说明符到 buffer将允许它被 const 修改成员函数。

关于c++ - 是否修改 const 对象的内部字节未定义行为,以防它包含由放置 new 构造的另一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64448779/

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