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

c++ - 对象的 std::vector 和 const 正确性

考虑以下:

显然,复制构造函数是不够的。我错过了什么?

编辑:
Ofc。我无法改变this->c方法operator=(),所以我看不到operator=()将如何使用(尽管 要求std::vector)。

0 投票
1 回答
813 浏览

c++ - C++ TR1:在 const 方法中使用均匀分布生成随机数的正确方法是什么?

我有一个简单的 const 方法想要生成一个随机数

这会导致您的标准(如果已模板化)const 违规错误

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.1/../../../../include/c++/4.5.1/tr1/random.tcc:910:4:错误: 传递 'const std::tr1::mersenne_twister' 作为 'result_type std::tr1::mersenne_twister<_UIntType, __w, __n, __m, __r, __a, __u, __s, __b, __t, __c, __l>::operator()() [with _UIntType = long unsigned int, int __w = 32, int __n = 624, int __m = 397, int __r = 31, _UIntType __a = 2567483615ul, int __u = 11, int __s = 7, _UIntType __b = 2636928640ul, int __t = 15, _UIntType __c = 4022730752ul, int __l = 18, result_type = long unsigned int]' 丢弃限定符

这在没有const_caston的情况下可行this吗?

0 投票
5 回答
1810 浏览

constants - D中的逻辑常量

D 有两种 const 类型:不可变变量是被声明为不可变的变量,并且始终是不可变的,而const变量只是对象的只读版本。

逻辑 const是指函数被标记为const,但允许对一个或多个成员变量进行写访问。它的典型用途是惰性求值,例如(在 C++ 中)

在这里,determinant()const,但仍然可以修改m_dirty,并且m_determinant由于它们被标记为mutable

D const(FAQ)说 D2 不支持逻辑 const,因为它提供的保证很弱,这阻碍了编写并发程序,并使某些优化更加困难。

我完全理解这个问题,但是如果我们需要逻辑常量怎么办?

考虑上面带有Matrix类的情况,但没有缓存(并且不需要任何逻辑常量)。还可以想象这个类在我的代码库中使用,并且主要通过 const 引用访问。

现在考虑分析表明该determinant()函数是代码中的瓶颈,此外,它通常被重复访问,其值很少改变,即缓存,如上所述,将是一个完美的优化。

如果没有逻辑常量,我怎么能做到这一点?遍历我的代码库将 const 引用更改为非 const 引用不是一种选择(出于显而易见的原因)。

我有哪些选择(如果有)?

0 投票
4 回答
148 浏览

c++ - 我在这 1 行代码中的语法有什么问题(指针、引用和取消引用哦,我的)?

我遇到问题的代码是这一行:

我的类中的 + 运算符是这样重载的(有多种重载可以适合这个集合,但它们都有一个相似的标题):

上面代码中的 setarray 都是指针数组,但是 + 运算符需要引用,这可能是问题所在。

结果的方法 AddElement 有这个头:

标题中的 Multinumber* 是上面提到的 Rational 的父类。我认为任何特定的代码都不重要。我很确定这是一个语法问题。

我的编译器错误是:

感谢您的帮助!

0 投票
1 回答
476 浏览

c++ - 为什么“gptr”类型是 basic_streambuf char_type* 而不是 const char_type*?

basic_streambuf设置 streambuf 的三个“gptrs”的成员声明setg为:

我想知道:为什么每个 gptr 的类型都是char_type*而不是const char_type*const_cast在这里使用这些 gptrs 使用 const char 指针是否安全?

0 投票
1 回答
285 浏览

c++ - 麻烦:'const int * const & alias_for_ptr = ptr;',为什么两个标识符有不同的值?

0 投票
1 回答
724 浏览

c++ - 惰性求值和 const 正确性问题

我制作了一个 openGL 相机类,它使用惰性评估通过 getter 函数提供最终投影或模型视图投影矩阵。用户在实例的整个生命周期中提供各种相机参数(FOV、位置等),但不是每次更改参数时都重新计算投影矩阵和/或 MVP 矩阵,而是设置“更改”标志(即旧的缓存矩阵现在无效)。每当用户随后请求更新后的最终矩阵时,都会重新计算它,缓存结果,并返回一个 const 引用。

一切听起来都很好,直到我打电话给我:

来自 const oE_GLCamera 实例的函数...我在应用程序中的任何地方都使用 const 引用从 CAD 视口中提取相机数据而不更改相机,但是如果成员变量无效,我的 getter 函数会对成员变量执行惰性求值 - 因此破坏了 const 正确性。

是否有我不知道的语言功能或设计范例可以帮助解决这个问题?还是惰性求值从根本上与 const 正确性不兼容?我知道 const_cast<>,我自己从未使用过它,但阅读了一些关于它的内容,归结为:如果你使用它,那么你已经在某个地方出错了。还是会成为我的救星?

任何建议都会受到欢迎,Cam

0 投票
1 回答
2810 浏览

c++ - 将 const void* 转换为 const int*

我之前没有使用过 void* 和 const_correctness,所以我不明白我在下面的代码中做错了什么。我想要的只是将 const 对象的成员函数返回的 void* 转换为 int*。请提出更好的方法。谢谢你。

我收到以下错误

所以这是我遇到问题的实际程序

在这种情况下,只有诸如“print()”之类的方法才知道“getData”返回的数据类型。我不能使用模板,因为用户不知道 MyClass 是如何实现的。谢谢你。随意提出替代方案。

0 投票
2 回答
333 浏览

c++ - 构造函数中的 const_cast 可接受

这是对 const_cast 的有效使用吗?我在构造函数中使用它,它看起来如下:

是的,琴弦永远不会改变。

0 投票
7 回答
34826 浏览

c++ - 如何在 const 函数中调用非常量函数 (C++)

我有一个看起来像这样的遗留函数:

我需要在该遗留代码中调用一个函数,使其现在看起来像这样:

问题是我收到了这个错误:

现在我知道为了修复这个错误,我可以创建newCall()一个 const 函数。但是后来我必须进行几个newCall()函数调用,所以现在我必须将所有这些函数调用都设为 const。依此类推,直到最终我觉得我的程序的一半将是 const。

我的问题:有没有办法在 Random() 中调用不是 const 的函数?或者是否有人对如何newCall()Random()不使我的程序一半变为常量的情况下实现内部有任何想法。

谢谢

-乔希