问题标签 [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 回答
706 浏览

c++ - const-正确性和安全的布尔成语

我有另一个与安全布尔成语有关的问题:

bool_type(typedef)和this_type_does_not_support_comparisons是怎么来的const?无论如何,没有人应该通过返回指针实际调用成员函数,对吧?这里有const必要吗?operator bool_type否则(成员函数)会违反 const 正确性吗?

0 投票
5 回答
413 浏览

c++ - 执行二进制序列化时删除字符串流结果的常量是否安全?

我有一种情况,我正在执行一些项目的二进制序列化,并将它们写入一个不透明的字节缓冲区:

从结果中删除const-nessss.str().c_str()然后将其分配给缓冲区是否安全?reinterpret_castunsigned char*

注意:代码只是为了让您了解我在做什么,它不一定编译。

0 投票
1 回答
2845 浏览

c++ - 尾随返回类型、decltype 和 const-ness

我只是在尝试新的尾随返回类型,但我遇到了这个(简化的)代码的问题

忽略这段代码毫无意义的事实。重要的部分是使用 GCC 4.6.1(带-std=c++0x标志)时产生的编译器错误:

如果您不喜欢涉及模板的错误,短篇小说是在const版本的主体中MyContainer::begin,表达式ints.begin()返回一个类型的值std::list<int>::const_iterator(因为intsconst这样的上下文中)。但是,decltype(ints.begin())产生 type std::list<int>::iterator,即在决定表达式的类型时decltype 忽略方法的const限定符。begin不出所料,结果是类型冲突。

在我看来,这似乎是 GCC 编译器中的一个错误。decltype只有尊重const限定符并产生const_iterator类型才有意义。任何人都可以确认或否认(甚至可能解释)这一点吗?也许我忽略了 的机制中的某些内容decltype,但这看起来是一个非常简单的场景。

注意:据我所知,相同的行为不仅适用于,而且适用于任何具有在-ness 上std::list<int>重载的返回不兼容类型的成员函数的类型。const

0 投票
4 回答
221 浏览

c++ - 有没有办法摆脱虚拟成员函数的常量性

我需要为定义如下的接口实现模拟:

我的模拟类需要保存所有发送给类的事件 ID。这就是我打算这样做的方式。

但显然编译器拒绝这种构造。是否有任何解决方案(假设界面无法更改)?

我意识到我可以为此使用两个类。但是有没有办法让编译器关闭并允许我这样做,类似于 const_cast?

0 投票
7 回答
713 浏览

c++ - 是否值得插入`const`-正确性

我目前面临一个由一些高级程序员编写的 C++ 项目,该项目由大约 400 个文件和 200 个类组成。

代码经过精心设计,运行良好且稳定。

虽然我正在添加一些功能,但对我来说,注意正确性只是普通的做法const

但是,如果我开始声明我的新成员函数const,那么为了使事情正常进行,调整旧代码是没有止境的。

  • const我应该投入大量时间在此代码中引入正确性吗?
  • 更糟糕的是,我必须触摸和更改旧的成熟代码,并向前辈解释我在代码审查期间做了什么。这值得么?
0 投票
2 回答
1138 浏览

iphone - NSString "initWithBytesNoCopy:length:encoding:freeWhenDone:" 可以修改输入“字节”?

“字节”不是 const 指针。这是否意味着此方法可能会修改“字节”?

0 投票
4 回答
23485 浏览

c++ - 如何从 const 方法调用非 const 方法?

我的类中有一个 const 方法,不能将其更改为非常量。在这种方法中,我需要调用一个非常量方法,但编译器不允许我这样做。

有什么办法吗?这是我的代码的简化示例:

0 投票
5 回答
605 浏览

c++ - 堆分配的 const 对象与非 const 对象有何不同?

在 C++ 中,可以在堆上分配一个 const 对象

这样写入对象的尝试将是UB。

我不明白这样的对象与未声明的堆分配对象有何不同const

我的意思是当我在堆栈上分配一个对象时,它会进入特定于实现的自动存储,因此可能有一些特定于实现的方法允许const以某种特殊方式分配对象,当我写入对象时会产生 UB。

然而,每当我使用new编译器时,都需要发出operator new()函数调用,并且该函数不可能做任何不同的事情——它只是以统一的方式分配内存,而不管const我的代码中是否存在。

堆分配的const对象与非堆分配的对象有何不同const?如果我尝试修改它,未定义的行为又如何可能?

0 投票
5 回答
837 浏览

c++ - 为什么在丢弃指向该对象的指针的常量而不是UB之后写入非常量对象?

根据 C++ 标准,如果对象最初不是本身,则可以放弃const指针并写入对象。const这样:

没关系,但是这个:

是UB。

原因是当对象本身是const允许编译器优化对它的访问时,例如,不执行重复读取,因为重复读取对不变的对象没有意义。

问题是编译器如何知道哪些对象实际上是const?例如,我有一个功能:

它被编译成一个静态库,编译器不知道它将被调用哪些对象。

现在调用代码可以这样做:

它会很好,或者它可以这样做:

这将是未定义的行为。

编译器应该如何遵守这些要求?如何在不让后者工作的情况下让前者工作?

0 投票
3 回答
160 浏览

c++ - 如何在不欺骗编译器的情况下保持这个常量正确?

我有一个这样的 C++ 类:

基本上getSomeProperty()返回一些已经使用加载的数据lazilyLoadSomeData()。由于我不想在需要之前加载此数据,因此我在其中调用此方法getSomeProperty()

这不起作用,因为 lazilyLoadSomeData() 不是 const。即使它只更改可变数据成员,编译器也不会允许它。我能想到的唯一两个解决方案是:

  • 在类构造函数中加载数据,但我不想这样做,因为延迟加载所有内容会使应用程序更快。

  • 使lazilyLoadSomeData()常量。它会起作用,因为它只更改可变成员,但它似乎并不正确,因为从名称来看,该方法显然正在加载某些内容并且显然正在进行一些更改。

关于什么是处理这个问题的正确方法的任何建议,而不必欺骗编译器(或完全放弃 const 正确性)?