问题标签 [const-correctness]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1610 浏览

c - 对 const 正确性与指向 const 对象的静态指针数组感到困惑

我仍然不确定我是否完全了解这种特殊情况应该如何解决。所以如果我想声明一个不会改变的 NSStrings 数组,这是正确的吗?

static必要吗?(它有什么作用?)我在const某个地方错过了额外的东西吗?它去的地方太多了!呸!我做错了,还是我只是偏执?

0 投票
7 回答
2718 浏览

c++ - 如何处理 const 对象中非 const 引用成员的初始化?

假设你有一堂课

现在你可能想定义这个类的 const 实例

但这会因为非常量 int C 的构造函数 C(int * v) 而失败

所以你定义了一个 const int 构造函数

但这也会失败,因为 C 的成员“int * i”是非常量的。

在这种情况下该怎么办?使用可变的?铸件?准备类的 const 版本?

编辑:在与 Pavel(下)讨论后,我对这个问题进行了一些调查。对我来说,C++ 所做的并不正确。指针目标应该是严格类型,这意味着您不能例如执行以下操作:

在这种情况下,语言语法将const其视为不更改指针目标的承诺。另外int * const ptr是一个不改变指针值本身的承诺。因此,您有两个可以应用 const 的地方。然后你可能希望你的类为指针建模(为什么不)。而这里的事情正在分崩离析。C++ 语法提供了 const 方法,这些方法能够保证不会更改字段的值本身,但没有语法指出您的方法不会更改类内指针的目标。

一种解决方法是定义两个类const_CC例如。然而,这不是一条王道。使用模板,它们的部分专业化很难不陷入混乱。此外,所有可能的参数变体,如const const_C & arg, const C & arg, const_C & arg,C & arg看起来都不漂亮。我真的不知道该怎么办。使用单独的类或 const_casts,每种方式似乎都是错误的。

在这两种情况下,我应该将不修改指针目标的方法标记为 const 吗?或者只是遵循 const 方法本身不会改变对象状态的传统路径(const 方法不关心指针目标)。然后在我的情况下,所有方法都是 const,因为类正在建模指针,因此指针本身是T * const. 但很明显,其中一些修改了指针的目标,而另一些则没有。

0 投票
6 回答
7557 浏览

c++ - 值参数的 const 正确性

我知道几乎没有关于 const 正确性的问题,其中声明函数的声明及其定义不需要就值参数达成一致。这是因为值参数的常量只在函数内部很重要。这可以:

这样做真的是最佳实践吗?因为我从未见过有人这样做。我在其他地方看到过这个引用(不确定来源),这已经被讨论过:

“事实上,对于编译器来说,无论你是否在值参数前面包含这个 const,函数签名都是一样的。”

“避免在函数声明中使用 const 传值参数。如果不修改,仍然在同一函数的定义中使用 const 参数。”

第二段说不要将 const 放在声明中。我认为这是因为值参数的常量作为接口定义的一部分是没有意义的。这是一个实现细节。

基于这个推荐,指针参数的指针值是否也推荐?(它对引用参数没有意义,因为您不能重新分配引用。)

总结:制作值参数对于捕获一些逻辑错误很有用。这是最佳实践吗?您是否走到了将 const 排除在头文件之外的极端?const 指针值是否同样有用?为什么或者为什么不?

一些参考资料:

C++ const 关键字 - 随意使用? 对函数参数使用“const”

const 值参数何时有用的示例:

0 投票
1 回答
366 浏览

c++ - 此代码在 C++ 中是否合法

我刚刚发现,当涉及到模板时,这段代码可以在 g++ 3.4.2 中编译并且除非 m() 没有被调用,否则它可以工作:

现在可以创建和使用实例

直到c.m()没有调用没有编译错误,但这合法吗?

0 投票
4 回答
4363 浏览

c++ - “const LPVOID”是否等同于“void * const”?

如果是这样,为什么某些 Win32 标头使用它?

例如:

更详细一点:如果 API 从不使用引用(或任何其他仅 C++ 的构造),而只使用指针和值,那么使用const LPVOIDvs.有什么意义呢LPCVOID

我应该把我看到const LPVOID的每一个地方都当作真正意义所在的地方LPCVOID吗?(因此添加演员表是安全的)

进一步澄清:在这种情况下,这似乎const LPVOID pBlock确实是一个错误。Windows 2008 SDK 将其替换为LPCVOID签名VerQueryValue。葡萄酒在很久以前就这样做了。

0 投票
8 回答
4609 浏览

c++ - const 正确性: const char const * const GetName const (//stuff);

标记为家庭作业,因为这是我在期中写的一个我不明白答案的问题。我被要求在以下声明中解释每个 const 的用途:

那么,这些 const 的解释是什么?

0 投票
6 回答
5166 浏览

c++ - 在 C++ 中,堆分配的对象可以是 const 吗?

在 C++ 中,可以声明堆栈分配的对象const

之后尝试在此类对象上调用非常量方法是未定义的行为:

堆分配的对象会const产生同样的后果吗?我的意思是有可能是以下情况:

也是未定义的行为吗?

0 投票
4 回答
7520 浏览

c++ - 关于 const 成员函数

我遇到了两个关于 const 成员函数的解释

  1. 这意味着它只能访问常量成员;
  2. 这意味着它不会修改任何成员;

我认为第二个是对的。但是为什么第一个出来?有什么需要澄清的吗?

谢谢!

0 投票
5 回答
1842 浏览

c++ - 如何在模板函数签名中要求 const_iterator 语义?

我正在创建一个构造函数,它将采用一对输入迭代器。我希望方法签名具有const类似于以下的编译时语义:

但是,我找不到任何这样的例子。例如,我的 STL 实现的范围构造函数vector定义为:

它没有编译时const保证。 iterator_category/iterator_traits<>也不包含任何与 相关的内容const

有什么方法可以表明来保证调用者我不能修改输入数据?

编辑,2010-02-03 16:35 UTC

作为我想如何使用该函数的示例,我希望能够传递一对char*指针,并根据函数签名知道它们指向的数据不会被修改。
我希望我可以避免创建一对const char*指针来保证 const_iterator 语义。在这种情况下,我可能会被迫支付模板税。

0 投票
5 回答
7421 浏览

c++ - 为什么将“指向非 const 的指针”转换为“指向 const 的指针”是不合法的

将指向非 const 的指针转换为指向 const 的指针合法的。

那么为什么将指向非 const指针转换为指向 const 的指针是不合法的呢?

例如,为什么下面的代码是非法的: