问题标签 [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.
c - 对 const 正确性与指向 const 对象的静态指针数组感到困惑
我仍然不确定我是否完全了解这种特殊情况应该如何解决。所以如果我想声明一个不会改变的 NSStrings 数组,这是正确的吗?
有static
必要吗?(它有什么作用?)我在const
某个地方错过了额外的东西吗?它去的地方太多了!呸!我做错了,还是我只是偏执?
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_C
,C
例如。然而,这不是一条王道。使用模板,它们的部分专业化很难不陷入混乱。此外,所有可能的参数变体,如const const_C & arg
, const C & arg
, const_C & arg
,C & arg
看起来都不漂亮。我真的不知道该怎么办。使用单独的类或 const_casts,每种方式似乎都是错误的。
在这两种情况下,我应该将不修改指针目标的方法标记为 const 吗?或者只是遵循 const 方法本身不会改变对象状态的传统路径(const 方法不关心指针目标)。然后在我的情况下,所有方法都是 const,因为类正在建模指针,因此指针本身是T * const
. 但很明显,其中一些修改了指针的目标,而另一些则没有。
c++ - 值参数的 const 正确性
我知道几乎没有关于 const 正确性的问题,其中声明函数的声明及其定义不需要就值参数达成一致。这是因为值参数的常量只在函数内部很重要。这可以:
这样做真的是最佳实践吗?因为我从未见过有人这样做。我在其他地方看到过这个引用(不确定来源),这已经被讨论过:
“事实上,对于编译器来说,无论你是否在值参数前面包含这个 const,函数签名都是一样的。”
“避免在函数声明中使用 const 传值参数。如果不修改,仍然在同一函数的定义中使用 const 参数。”
第二段说不要将 const 放在声明中。我认为这是因为值参数的常量作为接口定义的一部分是没有意义的。这是一个实现细节。
基于这个推荐,指针参数的指针值是否也推荐?(它对引用参数没有意义,因为您不能重新分配引用。)
总结:制作值参数对于捕获一些逻辑错误很有用。这是最佳实践吗?您是否走到了将 const 排除在头文件之外的极端?const 指针值是否同样有用?为什么或者为什么不?
一些参考资料:
C++ const 关键字 - 随意使用? 对函数参数使用“const”
const 值参数何时有用的示例:
c++ - 此代码在 C++ 中是否合法
我刚刚发现,当涉及到模板时,这段代码可以在 g++ 3.4.2 中编译并且除非 m() 没有被调用,否则它可以工作:
现在可以创建和使用实例
直到c.m()
没有调用没有编译错误,但这合法吗?
c++ - “const LPVOID”是否等同于“void * const”?
如果是这样,为什么某些 Win32 标头使用它?
例如:
更详细一点:如果 API 从不使用引用(或任何其他仅 C++ 的构造),而只使用指针和值,那么使用const LPVOID
vs.有什么意义呢LPCVOID
?
我应该把我看到const LPVOID
的每一个地方都当作真正意义所在的地方LPCVOID
吗?(因此添加演员表是安全的)
进一步澄清:在这种情况下,这似乎const LPVOID pBlock
确实是一个错误。Windows 2008 SDK 将其替换为LPCVOID
签名VerQueryValue
。葡萄酒在很久以前就这样做了。
c++ - const 正确性: const char const * const GetName const (//stuff);
标记为家庭作业,因为这是我在期中写的一个我不明白答案的问题。我被要求在以下声明中解释每个 const 的用途:
那么,这些 const 的解释是什么?
c++ - 在 C++ 中,堆分配的对象可以是 const 吗?
在 C++ 中,可以声明堆栈分配的对象const
:
之后尝试在此类对象上调用非常量方法是未定义的行为:
堆分配的对象会const
产生同样的后果吗?我的意思是有可能是以下情况:
也是未定义的行为吗?
c++ - 关于 const 成员函数
我遇到了两个关于 const 成员函数的解释
- 这意味着它只能访问常量成员;
- 这意味着它不会修改任何成员;
我认为第二个是对的。但是为什么第一个出来?有什么需要澄清的吗?
谢谢!
c++ - 如何在模板函数签名中要求 const_iterator 语义?
我正在创建一个构造函数,它将采用一对输入迭代器。我希望方法签名具有const
类似于以下的编译时语义:
但是,我找不到任何这样的例子。例如,我的 STL 实现的范围构造函数vector
定义为:
它没有编译时const
保证。 iterator_category
/iterator_traits<>
也不包含任何与 相关的内容const
。
有什么方法可以表明来保证调用者我不能修改输入数据?
编辑,2010-02-03 16:35 UTC
作为我想如何使用该函数的示例,我希望能够传递一对char*
指针,并根据函数签名知道它们指向的数据不会被修改。
我希望我可以避免创建一对const char*
指针来保证 const_iterator 语义。在这种情况下,我可能会被迫支付模板税。
c++ - 为什么将“指向非 const 的指针”转换为“指向 const 的指针”是不合法的
将指向非 const 的指针转换为指向 const 的指针是合法的。
那么为什么将指向非 const的指针转换为指向 const 的指针是不合法的呢?
例如,为什么下面的代码是非法的: