问题标签 [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-正确性和安全的布尔成语
我有另一个与安全布尔成语有关的问题:
bool_type
(typedef)和this_type_does_not_support_comparisons
是怎么来的const
?无论如何,没有人应该通过返回指针实际调用成员函数,对吧?这里有const
必要吗?operator bool_type
否则(成员函数)会违反 const 正确性吗?
c++ - 执行二进制序列化时删除字符串流结果的常量是否安全?
我有一种情况,我正在执行一些项目的二进制序列化,并将它们写入一个不透明的字节缓冲区:
从结果中删除const
-nessss.str().c_str()
然后将其分配给缓冲区是否安全?reinterpret_cast
unsigned char*
注意:代码只是为了让您了解我在做什么,它不一定编译。
c++ - 尾随返回类型、decltype 和 const-ness
我只是在尝试新的尾随返回类型,但我遇到了这个(简化的)代码的问题
忽略这段代码毫无意义的事实。重要的部分是使用 GCC 4.6.1(带-std=c++0x
标志)时产生的编译器错误:
如果您不喜欢涉及模板的错误,短篇小说是在const
版本的主体中MyContainer::begin
,表达式ints.begin()
返回一个类型的值std::list<int>::const_iterator
(因为ints
在const
这样的上下文中)。但是,decltype(ints.begin())
产生 type std::list<int>::iterator
,即在决定表达式的类型时decltype
忽略方法的const
限定符。begin
不出所料,结果是类型冲突。
在我看来,这似乎是 GCC 编译器中的一个错误。decltype
只有尊重const
限定符并产生const_iterator
类型才有意义。任何人都可以确认或否认(甚至可能解释)这一点吗?也许我忽略了 的机制中的某些内容decltype
,但这看起来是一个非常简单的场景。
注意:据我所知,相同的行为不仅适用于,而且适用于任何具有在-ness 上std::list<int>
重载的返回不兼容类型的成员函数的类型。const
c++ - 有没有办法摆脱虚拟成员函数的常量性
我需要为定义如下的接口实现模拟:
我的模拟类需要保存所有发送给类的事件 ID。这就是我打算这样做的方式。
但显然编译器拒绝这种构造。是否有任何解决方案(假设界面无法更改)?
我意识到我可以为此使用两个类。但是有没有办法让编译器关闭并允许我这样做,类似于 const_cast?
c++ - 是否值得插入`const`-正确性
我目前面临一个由一些高级程序员编写的 C++ 项目,该项目由大约 400 个文件和 200 个类组成。
代码经过精心设计,运行良好且稳定。
虽然我正在添加一些功能,但对我来说,注意正确性只是普通的做法const
。
但是,如果我开始声明我的新成员函数const
,那么为了使事情正常进行,调整旧代码是没有止境的。
const
我应该投入大量时间在此代码中引入正确性吗?- 更糟糕的是,我必须触摸和更改旧的成熟代码,并向前辈解释我在代码审查期间做了什么。这值得么?
iphone - NSString "initWithBytesNoCopy:length:encoding:freeWhenDone:" 可以修改输入“字节”?
“字节”不是 const 指针。这是否意味着此方法可能会修改“字节”?
c++ - 如何从 const 方法调用非 const 方法?
我的类中有一个 const 方法,不能将其更改为非常量。在这种方法中,我需要调用一个非常量方法,但编译器不允许我这样做。
有什么办法吗?这是我的代码的简化示例:
c++ - 堆分配的 const 对象与非 const 对象有何不同?
在 C++ 中,可以在堆上分配一个 const 对象:
这样写入对象的尝试将是UB。
我不明白这样的对象与未声明的堆分配对象有何不同const
:
我的意思是当我在堆栈上分配一个对象时,它会进入特定于实现的自动存储,因此可能有一些特定于实现的方法允许const
以某种特殊方式分配对象,当我写入对象时会产生 UB。
然而,每当我使用new
编译器时,都需要发出operator new()
函数调用,并且该函数不可能做任何不同的事情——它只是以统一的方式分配内存,而不管const
我的代码中是否存在。
堆分配的const
对象与非堆分配的对象有何不同const
?如果我尝试修改它,未定义的行为又如何可能?
c++ - 为什么在丢弃指向该对象的指针的常量而不是UB之后写入非常量对象?
根据 C++ 标准,如果对象最初不是本身,则可以放弃const
指针并写入对象。const
这样:
没关系,但是这个:
是UB。
原因是当对象本身是const
允许编译器优化对它的访问时,例如,不执行重复读取,因为重复读取对不变的对象没有意义。
问题是编译器如何知道哪些对象实际上是const
?例如,我有一个功能:
它被编译成一个静态库,编译器不知道它将被调用哪些对象。
现在调用代码可以这样做:
它会很好,或者它可以这样做:
这将是未定义的行为。
编译器应该如何遵守这些要求?如何在不让后者工作的情况下让前者工作?
c++ - 如何在不欺骗编译器的情况下保持这个常量正确?
我有一个这样的 C++ 类:
基本上getSomeProperty()
返回一些已经使用加载的数据lazilyLoadSomeData()
。由于我不想在需要之前加载此数据,因此我在其中调用此方法getSomeProperty()
这不起作用,因为 lazilyLoadSomeData() 不是 const。即使它只更改可变数据成员,编译器也不会允许它。我能想到的唯一两个解决方案是:
在类构造函数中加载数据,但我不想这样做,因为延迟加载所有内容会使应用程序更快。
使
lazilyLoadSomeData()
常量。它会起作用,因为它只更改可变成员,但它似乎并不正确,因为从名称来看,该方法显然正在加载某些内容并且显然正在进行一些更改。
关于什么是处理这个问题的正确方法的任何建议,而不必欺骗编译器(或完全放弃 const 正确性)?