【发布时间】:2012-08-28 11:55:32
【问题描述】:
在作为指针 (foo(void *bar)) 的函数参数中,您可以使用 const 来指定指针(参数)本身是常量 (foo(void * const bar)),和/或指针指向的数据是常量(foo(void const *bar))。
但是在 foo(void const *bar) 的情况下,这只是向调用者保证 foo 不会尝试修改 bar 指向的数据。它不给 bar 任何保证 foo 指向的内存位置将始终有效。
如果您在可执行映像中处理常量数据,如果您可以向 foo 提供该保证,并且如果 foo 需要保留对该数据的引用超过函数调用的持续时间,则 foo 可以简单地保留一个复制指针而不是复制数据。
有没有办法在 C++ 类型系统中编码这个保证?
谢谢。
【问题讨论】:
-
您可以使用
T const*&,这至少可以确保在呼叫者网站上您收到的任何邮件都是const,但我认为这没有多大帮助。 -
你总是可以使用诸如 boost 标签系统之类的东西,它在类型系统中编码非类型信息。
-
您的意思是要问“有没有办法指定指针指向的数据总是有效”? “是”和“永远是”是有区别的。如果这就是你的意思,那么像
shared_ptr这样的标准库包装类之一可能会做你想做的事。 -
您希望对这些信息进行编码是为了谁的利益?作为对编译器的提示?还是作为开发人员阅读/使用代码的一种文档?
-
void const *bar不保证函数不会尝试修改数据。它传达意图;该函数可以通过丢弃 const 并修改数据来违反该意图。