问题标签 [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 投票
6 回答
22412 浏览

c - 为什么我不能在 C 中将 'char**' 转换为 'const char* const*'?

以下代码片段(正确)在 C 中给出警告,在 C++ 中给出错误(分别使用 gcc 和 g++,使用版本 3.4.5 和 4.2.1 进行测试;MSVC 似乎并不关心):

我可以理解并接受这一点。
此问题的 C++ 解决方案是将 b 更改为 const char * const *,这不允许重新分配指针并防止您规避 const-correctness ( C++ FAQ )。

但是,在纯 C 中,更正后的版本(使用 const char * const *)仍然会发出警告,我不明白为什么。有没有办法在不使用演员表的情况下解决这个问题?

澄清:
1)为什么这会在C中产生警告?它应该是完全 const 安全的,而且 C++ 编译器似乎也能认出它。
2)在说(并让编译器强制执行)我不会修改它指向的字符的同时,接受这个 char** 作为参数的正确方法是什么?例如,如果我想写一个函数:

我想在 char** 上调用它,参数的正确类型是什么?

0 投票
7 回答
16504 浏览

c# - C# 中的“常量正确性”

const 正确性的重点是能够提供用户无法更改或删除的实例视图。编译器通过指出何时从 const 函数中破坏 const 或尝试使用 const 对象的非 const 函数来支持这一点。因此,在不复制 const 方法的情况下,有没有可以在 C# 中使用的具有相同目的的方法?

我知道不变性,但这并没有真正延续到容器对象的名称中,只是一个例子。

0 投票
2 回答
4369 浏览

c# - 如何在 C# 中实现 const 正确性?

可能重复:
C# 中的“const 正确性”

我已经编写 C++ 多年,但对 C# 还是很陌生。在学习 C# 时,我发现const关键字的使用比在 C++ 中要受限得多。AFAIK,例如,没有办法向函数 const 声明参数。我对我可能会无意中更改我只能通过测试检测到的函数参数(可能是复杂的数据结构)的想法感到不舒服。

你如何处理这种情况?

0 投票
16 回答
29533 浏览

c++ - 向我推销 const 正确性

那么为什么总是建议尽可能多地使用 const 呢?在我看来,使用 const 可能比 C++ 中的帮助更痛苦。但话又说回来,我是从 python 的角度来看的:如果你不想改变某些东西,就不要改变它。话虽如此,这里有几个问题:

  1. 似乎每次我将某些东西标记为 const 时,我都会收到一个错误,并且必须在某个地方将其他一些函数也更改为 const。然后这导致我不得不在其他地方更改另一个功能。有了经验,这会变得更容易吗?

  2. 使用 const 的好处真的足以弥补麻烦吗?如果你不打算改变一个对象,为什么不写不改变它的代码呢?

我应该注意到,在这个时间点上,我最关注的是使用 const 来实现正确性和可维护性的好处,尽管了解性能影响也很好。

0 投票
6 回答
5883 浏览

c++ - 为什么我的返回类型没有意义?

我正在尝试使用const MyClass * const. 但是,我收到警告:

警告:#815-D:返回类型的类型限定符没有意义。

这不是有效类型吗?我想要一个无法更改的指针,并且我希望它指向的东西也不会被更改。

0 投票
6 回答
991 浏览

c++ - 观察者模式中的 const-correct Notifier

我想实现一个不改变模型的模型类的观察者。因此,它应该能够使用 const-Reference 来访问模型。但观察员登记禁止这样做。

以下是我的项目中如何实现观察者模式:

非修改观察者需要“更改”模型的唯一地方是它想要注册它的时候。我觉得我无法避免 const_cast 这里,但我想知道是否有更好的解决方案。

旁注:换句话说,我不认为模型对象管理的“观察者列表”是模型状态的一部分。C++ 无法区分并将状态和观察者混为一谈,迫使两者都是 const 或 non-const。

干杯,菲利克斯

0 投票
9 回答
741 浏览

c# - const 正确性如何帮助编写更好的程序?

这个问题来自一个 C# 的人问 C++ 的人。(我对 C 有一定的了解,但只对 C++ 有一些常识)。

很多使用 C# 的 C++ 开发人员说他们错过了 const 的正确性,这对我来说似乎很奇怪。在 .Net 中,为了禁止更改事物,您需要创建不可变对象或具有只读属性/字段的对象,或传递对象的副本(默认情况下复制结构)。

是 C++ const 正确性,一种创建不可变/只读对象的机制,还是还有更多?如果目的是创建不可变/只读对象,则可以在 .Net 等环境中完成相同的操作。

0 投票
3 回答
2056 浏览

c++ - STL 容器中的 const 指针

你好 C++ 程序员。我希望成为一个关于 STL 容器的快速问题:

此语句在某些 C++ 源文件(带有适当的包含)中使用时编译得很好。但

或者

使用 gcc(gcc 版本 4.0.1(Apple Inc. build 5484))时无法编译。但是,使用 Visual Studio 2008 C++ 编译器,没有任何抱怨。

一些研究发现 STL 容器中的元素必须是Assignable. VC 实现中是否存在 STL 错误(我会说:“不太可能”)还是他们使用了另一个概念Assignable

0 投票
11 回答
1831 浏览

c++ - 如何从 const 方法生成非常量方法?

在努力实现 const 正确性的同时,我经常发现自己在编写这样的代码

对于很多方法,例如bar(). 编写这些手动调用 const 的非常量方法很乏味;此外,我觉得我在重复自己——这让我感觉很糟糕。

我能做些什么来减轻这个任务?(不允许使用宏和代码生成器。)

编辑:除了 litb 的解决方案,我也喜欢我自己的解决方案。:)

0 投票
14 回答
8561 浏览

c++ - 为什么 const 正确性特定于 C++?

免责声明:我知道关于 const 正确性的有用性有两个问题,但是,没有人讨论与其他编程语言相比,在 C++ 中如何需要 const 正确性。另外,我对这些问题的答案不满意。

我现在已经使用了几种编程语言,而在 C++ 中困扰我的一件事是 const 正确性的概念。在 Java、C#、Python、Ruby、Visual Basic 等中没有这样的概念,这似乎是 C++ 特有的。

在您向我推荐 C++ FAQ Lite 之前,我已经阅读了它,但它并不能说服我。完全有效、可靠的程序一直都是用 Python 编写的,并且没有 const 关键字或等效关键字。在 Java 和 C# 中,对象可以声明为 final(或 const),但没有 const 成员函数或 const 函数参数。如果一个函数不需要修改一个对象,它可以采用一个只提供对该对象的读取访问的接口。该技术同样可以在 C++ 中使用。在我研究过的两个真实世界的 C++ 系统上,几乎没有在任何地方使用 const,而且一切正常。所以我对让 const 污染代码库的用处还很远。

我想知道在 C++ 中是什么使 const 成为必要,而不是其他编程语言。

到目前为止,我只看到了一种必须使用 const 的情况:

Visual Studio 接受使用注释掉的 const 进行编译,但使用警告C4239,使用非标准扩展。所以,如果你想要传递临时变量、避免复制和保持标准兼容的语法简洁,你必须通过 const 引用传递,没有办法绕过它。尽管如此,这更像是一个怪癖而不是根本原因。

否则,实际上没有必须使用 const 的情况,除非与使用 const 的其他代码交互。在我看来,Const 只不过是一种自以为是的瘟疫,它蔓延到它所触及的一切:

const 在 C++ 中起作用的原因是你可以抛弃它。如果你不能把它扔掉,那么你的世界就会糟透了。如果你声明一个接受 const Bla 的方法,你可以传递一个非常量 Bla。但是如果反过来就不行了。如果您声明一个采用非常量 Bla 的方法,则不能将其传递给 const Bla。所以现在你被卡住了。所以你逐渐需要一个非 const 的东西的 const 版本,你最终会得到一个影子世界。在 C++ 中你可以摆脱它,因为与 C++ 中的任何东西一样,无论你是否想要这个检查都是完全可选的。如果你不喜欢它,你可以把它打掉。

Anders Hejlsberg(C# 架构师),CLR 设计选择