Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算对象在其析构函数中的常数_C++_Constants_Destructor - Fatal编程技术网

C++ 计算对象在其析构函数中的常数

C++ 计算对象在其析构函数中的常数,c++,constants,destructor,C++,Constants,Destructor,我有一个类,有两个函数foo(const和non-const): 这段代码打印“non-const-foo”两次。我希望它打印“non-const-foo”,后跟“const-foo”。C++可以吗? 编辑:一些人要求更多的背景。在实际代码中,stuff基本上是一些数据的句柄。如果以非常量的方式访问stuff,那么我假设数据已经被修改,因此我需要使用foo函数将其与其他进程(MPI)通信(在我完成修改后->在析构函数中,当我释放句柄时)。如果它是以常量的方式访问的,我知道我不需要传输任何东西,所

我有一个类,有两个函数foo(const和non-const):

这段代码打印“non-const-foo”两次。我希望它打印“non-const-foo”,后跟“const-foo”。C++可以吗?

编辑:一些人要求更多的背景。在实际代码中,stuff基本上是一些数据的句柄。如果以非常量的方式访问stuff,那么我假设数据已经被修改,因此我需要使用foo函数将其与其他进程(MPI)通信(在我完成修改后->在析构函数中,当我释放句柄时)。如果它是以常量的方式访问的,我知道我不需要传输任何东西,所以我调用non-const-foo,这没有任何作用

[…]
const
volatile
语义(7.1.6.1)不适用于正在销毁的对象。当 最派生对象(1.8)的析构函数启动

N4141中的12.4/2[class.dtor]


所以不,这是不可能的。

析构函数销毁对象,根据定义,它不是常量。Const仅在调用
stuff.foo()
cstuff.foo()
时适用。无法检测对象是构造函数还是析构函数中的
Const
。这可能是一个。它在构造函数和析构函数中都不是常量。您想在构造函数中知道它是否会,在析构函数中知道它是否会。根据您的编辑:听起来好像您正在尝试实现某种事务语义。跟踪是否使用标志(仅在可变代码路径上设置)修改了状态,并根据是否切换了该标志在析构函数中实现条件行为,这可能有意义吗?我觉得您可能需要两种不同的类型,
MutableStuff
ImmutableStuff
。但是请注意,您仍然可以调用
static\u cast(*this).foo()
来调用函数的常量版本。@Artyer但您必须知道是否需要,这似乎是问题的核心。在其他方法中呢?原则上可以从类内部确定所创建对象的恒常性吗?@DmytroDadyka在普通成员函数中,可以根据恒常性进行重载,如OP中所示。@DmytroDadyka No,构造函数基本上与我在这里引用的子句相同,请参见12.1/3。
class Stuff
{
public:
    ~Stuff() { foo(); }

    void foo() const { cout << "const foo" << endl; }
    void foo()       { cout << "non-const foo" << endl; }
};
{ Stuff stuff; }
{ const Stuff cstuff; }