gpt4 book ai didi

c++ - 一个对象能知道它自己的常量吗?

转载 作者:可可西里 更新时间:2023-11-01 15:38:15 27 4
gpt4 key购买 nike

使用 decltypestd::is_const 可以从外部检测变量的常量性。 但是对象是否也可以知道自己的常量?用法应该是这样的:

#include <type_traits>
#include <iostream>
#include <ios>

struct Test
{
Test() {}

bool print() const
{
// does not work as is explained in https://stackoverflow.com/q/9890218/819272
return std::is_const<decltype(*this)>::value; // <--- what will work??
}
};

int main()
{
Test t;
const Test s;

// external constness test
std::cout << std::boolalpha << std::is_const<decltype(t)>::value << "\n";
std::cout << std::boolalpha << std::is_const<decltype(s)>::value << "\n";

// internal constness test
std::cout << std::boolalpha << t.print() << "\n";
std::cout << std::boolalpha << s.print() << "\n"; // <--- false??
}

LiveWorkSpace 上输出这有可能吗?

动机:我希望能够检测 const 成员函数是在 const 对象上调用还是来自非 const 对象。该对象可以例如代表一个缓存,成员代表一个 View 。如果缓存是常量,则可能会使用优化的绘制例程,而如果底层数据是非常量,绘制例程将需要定期检查数据是否已刷新。

注意:相关的question询问如何打破 const 对象的构建,但我不太明白对此的回答是否意味着对我的问题的肯定否定。如果没有,我想捕获 bool 值中的常量以供进一步使用。

编辑:正如@DanielFrey 指出的那样,构造函数不是测试常量性的好地方。 const 成员函数怎么样?


更新:感谢大家纠正我最初提出的不适定问题并提供了答案的各个部分(构造函数的常量定义错误、this 的右值化、 const 的上下文含义,事后看来我忽略的明显重载技巧,以及隐藏在阴影中的 const 引用别名漏洞)。对我来说,这个问题是最好的 Stackoverflow。我决定选择@JonathanWakely 的答案,因为它展示了如何定义 MutableImmutable 类,这些类加强了常量概念,以一种万无一失的方式实现我想要的。

最佳答案

构造函数(原来的问题)是不可能的,因为

12.1 Constructors [class.ctor]

4 A constructor shall not be virtual (10.3) or static (9.4). A constructor can be invoked for a const, volatile or const volatile object. A constructor shall not be declared const, volatile, or const volatile (9.3.2). const and volatile semantics (7.1.6.1) are not applied on an object under construction. They come into effect when the constructor for the most derived object (1.8) ends. A constructor shall not be declared with a ref-qualifier.

对于成员函数(当前问题),您可以简单地提供一个 const 和一个非 const 重载,将两者转发给一个(私有(private))方法,该方法采用作为 bool 模板参数的常量。

关于c++ - 一个对象能知道它自己的常量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15279508/

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