【发布时间】:2019-01-08 21:09:40
【问题描述】:
我的大部分代码库都是不可变的;但是,由于语言设计的怪癖,我无法标记我的变量const。
在绝大多数情况下,尤其是在与 C 代码互操作时,我发现函数参数没有标记为 const,即使它们可证明不会修改它们。
一个这样的例子是fts_open(...)。此时,编译器迫使我从大部分代码中繁琐地删除 const 限定符,从而消除了它提供的安全性。
一个简单的解决方案是使用-fpermissive 进行编译,但这完全违背了我的意图。
除了重写曾经编写的每一个 C 库之外,我还能做些什么来从依赖编译器中获得好处?
即这种类型的代码不起作用:
void function(immutable_type const ¶m)
{
char const * const fts_arg[2]{std::data(param.path), nullptr};
FTS *tree = fts_open(fts_arg, FTS_OPTIONS, nullptr);
...
}
此时我必须:
- 从
fts_args变量中删除 const。 - 从函数参数中删除 const。
- 从数据类型定义中的
path中删除 const。 - 从传递给
function的变量中删除const。 - 从整个调用链中递归删除
consts。
谢谢。 :)
【问题讨论】:
-
你知道调用是否真的是 const 吗?
-
如果您确实确定库不会修改数据,您可以编辑包含的标题,以便它们具有必要的
const— 或制作您自己的 C++ 友好版本的标题。 -
总是可以通过副本。效率低下,但它会工作。
-
显然,您链接中讨论的问题使得唯一可行的解决方案是
const_cast将参数设置为fts_open预期的类型(或从您的类型中删除有问题的const)。由于语言(C 和 C++)存在问题,上游声明不太可能更改。 -
不是
const_cast本身会导致UB,而是尝试修改const对象,fts_open可能会避免。