确定指向常量的指针是否指向常量对象?

4

有没有办法确定指向const的指针是否指向const对象?

bool is_const_object(const int* p) {
    return ???;
}

int main() {
    int x = 42;
    const int y = 43;
    assert(!is_const_object(&x));
    assert(is_const_object(&y));
}

3
很遗憾,没有这样的方式来实现。C++不能这样工作。你必须提供两个不同的重载函数,一个用于const类型,另一个用于非const类型,然后观察哪个被调用。 - Sam Varshavchik
在其生命周期内修改const对象仍然是未定义的行为。因此,在标准C++中没有办法检查它。 - StoryTeller - Unslander Monica
如果p的类型是一个推导的模板参数,你可以使用std::is_const来判断提供的参数是否为指向常量的指针。在is_const_object(&x)is_const_object(&y)的情况下,你会得到正确的结果,但它不能告诉你指向对象的const性质在所有情况下都是什么。 - François Andrieux
3
如果你想知道传递给 is_const_object 的指针类型是不是“指向常量的指针”,那很容易确定。但如果你想知道所指对象最初是否被声明为 const,这是不可能的。考虑以下代码:int x = 42; const int* p = &x; 在这种情况下,你会期望 is_const_object(p) 返回什么? - Igor Tandetnik
1
那么我相当确定它是不可能完成的。 - Igor Tandetnik
显示剩余2条评论
1个回答

7
不行。C++不会在运行时动态存储有关某个常量的信息,也无法在函数内静态知道数据是否为常量。
有一些情况下可以实现,但是有限制:
1. 您可以为每个常量实例添加自己的动态运行时信息。 2. 您可以修改可执行文件并通过检测内存中的段来检测元素。 3. 如果指针指向constexpr全局变量,则可以仔细编写代码以使其成为constexpr并检测它。 4. 您可以编写一个模板函数,它接受T* 并检测它是否为const。
这些都不能满足您的要求,但它们可以解决可能导致您出现问题的功能相关问题。

是的,我也预料到了。我猜实现在翻译过程中会丢弃对象是否为const的信息。我想需要一个新的编译器扩展来存储程序中的信息。 - Andrew Tomazos
1
这就是为什么const_cast通常是设计上的问题,只应在“紧急情况”下使用:通常你不知道结果是否真正可变。 - Asteroids With Wings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接