标签: const-correctness

cbegin/cend背后的原因是什么?

我想知道为什么cbegincend在C++ 11中引入?

什么情况下使用这些方法时,使得从常量重载的差异beginend

c++ iterator const-correctness const-iterator c++11

182
推荐指数
5
解决办法
5万
查看次数

卖我的正确性

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

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

  2. 使用const的好处真的足以弥补麻烦吗?如果您不打算更改对象,为什么不编写不会更改它的代码?

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

c++ const-correctness

121
推荐指数
13
解决办法
2万
查看次数

C#中的"const正确性"

const-correctness的要点是能够提供用户无法更改或删除的实例的视图.编译器支持这一点,指出何时从const函数中断开constness,或者尝试使用const对象的非const函数.因此,如果不复制const方法,我可以在C#中使用具有相同目的的方法吗?

我知道不变性,但这并不能真正地将容器对象转移到一个例子.

c# theory const-correctness

78
推荐指数
3
解决办法
1万
查看次数

const-correctness可以提高性能吗?

我已多次阅读过,在C或C++代码中强制执行const-correctness不仅是一个关于可维护性的好习惯,而且它可能允许编译器执行优化.但是,我也完全相反 - 它根本不会影响性能.

因此,您是否有一些示例,其中const正确性可以帮助您的编译器提高程序的性能?

c++ performance const-correctness

76
推荐指数
4
解决办法
2万
查看次数

const-correctness是否为编译器提供了更多优化空间?

我知道它提高了可读性并使程序不易出错,但它提高了多少性能?

在旁注中,参考和const指针之间的主要区别是什么?我会假设它们以不同的方式存储在内存中,但是如何呢?

c c++ pointers const const-correctness

76
推荐指数
3
解决办法
7302
查看次数

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

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

char **a;
const char** b = a;
Run Code Online (Sandbox Code Playgroud)

我能理解并接受这个.
这个问题的C++解决方案是将b更改为const char*const*,它不允许重新分配指针并阻止你绕过const-correctness(C++ FAQ).

char **a;
const char* const* b = a;
Run Code Online (Sandbox Code Playgroud)

但是,在纯C中,更正后的版本(使用const char*const*)仍会发出警告,我不明白为什么.有没有办法绕过这个而不使用演员?

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

void f(const char* const* in) {
  // Only reads the data from in, does not write to it
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:感谢那些做出回应的人,特别是那些提出问题和/或跟进我的回复的人.

我已经接受了这样一个答案,即如果没有演员阵容,我想做的事情是无法完成的,无论是否应该这样做.

c pointers const const-correctness

59
推荐指数
3
解决办法
2万
查看次数

只写指针类型

我正在为嵌入式系统编写软件.

我们使用指针访问FPGA器件的寄存器.
一些寄存器是只读的,而另一些寄存器是只写的.

只读寄存器在读取时将产生未定义的值.

我想定义一个指针类型,允许编译器检测何时从只写寄存器(也称为解除引用)读取值.

只使用C语言语法创建只写指针吗?
(我们正在使用C开发第一个原型,但是在第二代转向C++.)

如何在C++中创建高效的只写指针?(请记住,这不是跟踪动态内存中的项目,而是访问硬件地址.)

此代码用于安全性和质量最受关注的嵌入式系统.

c c++ pointers const-correctness readonly

50
推荐指数
5
解决办法
3089
查看次数

在声明之后是否有一些忍者技巧使变量保持不变?

我知道答案是99.99%没有,但我认为值得一试,你永远不会知道.

void SomeFunction(int a)
{
    // Here some processing happens on a, for example:
    a *= 50;
    a %= 10;
    if(example())
       a = 0;
    // From this point on I want to make "a" const; I don't want to allow
    // any code past this comment to modify it in any way.
}
Run Code Online (Sandbox Code Playgroud)

我可以做一些类似的东西const int b = a;,但它并不是真的相同,它会造成很多混乱.只接受C++ 0x解决方案.

编辑:另一个不那么抽象的例子,那个让我问这个问题的例子:

void OpenFile(string path)
{
    boost::to_lower(path);
    // I want path to be constant now
    ifstream ...
}
Run Code Online (Sandbox Code Playgroud)

编辑 …

c++ const-correctness c++11

47
推荐指数
6
解决办法
2万
查看次数

为什么const-correctness特定于C++?

免责声明:我知道有两个关于const-correctness有用的问题,但是,没有人讨论过如何在C++中使用const-correctness 而不是其他编程语言.此外,我对这些问题的答案不满意.

我现在使用了一些编程语言,在C++中让我烦恼的一件事就是const-correctness的概念.在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的一种情况:

#include <iostream>

struct Vector2 {
    int X;
    int Y;
};

void display(/* const */ Vector2& vect) {
    std::cout << vect.X << " " << vect.Y << std::endl;
}

int main() {
    display(Vector2());
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio接受使用const注释掉的编译,但是使用警告C4239时,使用非标准扩展.所以,如果你想要传递临时代码,避免副本和保持标准兼容的语法简洁,你必须通过const引用,不管它.不过,这更像是一个怪癖,而不是一个根本原因.

否则,实际上不存在必须使用const的情况,除非与使用const的其他代码连接.在我看来,康斯特似乎不是一个自以为是的瘟疫,它蔓延到它接触到的一切:

const在C++中工作的原因是因为你可以把它丢弃.如果你不能把它扔掉,那么你的世界就会糟透了.如果声明一个采用const Bla的方法,则可以将它传递给非const Bla.但如果是相反的方式你不能.如果声明一个采用非const Bla的方法,则不能将它传递给const Bla.所以现在你被卡住了.所以你逐渐需要一个不是const的所有东西的const版本,你最终得到了一个阴影世界.在C++中,你可以使用它,因为与C++中的任何东西一样,无论你是否想要这个检查,它都是纯粹可选的.如果你不喜欢它,你可以打破常量.

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

c++ const const-correctness

40
推荐指数
7
解决办法
7237
查看次数

对于非内置类型,使用const值返回函数有什么用例?

最近我读过,从函数返回值来为非内置类型限定返回类型const是有意义的,例如:

const Result operation() {
    //..do something..
    return Result(..);
}
Run Code Online (Sandbox Code Playgroud)

我很难理解这个的好处,一旦对象被返回肯定是调用者的选择来决定返回的对象是否应该是const?

c++ const-correctness

40
推荐指数
4
解决办法
7710
查看次数