标签: const

C++ const map元素访问

我试图使用operator []访问const C++映射中的元素,但此方法失败.我也尝试用"at()"来做同样的事情.这次工作.但是,我找不到任何关于使用"at()"来访问const C++映射中的元素的引用."at()"是C++地图中新添加的函数吗?我在哪里可以找到更多关于此的信息?非常感谢你!

一个例子如下:

#include <iostream>
#include <map>

using namespace std;

int main()
{
        map<int, char> A;
        A[1] = 'b';
        A[3] = 'c';

        const map<int, char> B = A;

        cout << B.at(3) << endl; // it works
        cout << B[3] << endl;  // it does not work

}
Run Code Online (Sandbox Code Playgroud)

对于使用"B [3]",它在编译期间返回以下错误:

t01.cpp:14:错误:将'const std :: map,std :: allocator >>'传递为'_Tp&std :: map <_Key,_Tp,_Compare,_Alloc> :: operator []的'this'参数( const _Key&)[with _Key = int,_Tp = char,_Compare = std :: less,_Alloc = std :: allocator>]'丢弃限定符

使用的编译器是g …

c++ stl const map

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

为什么C++中的引用不是"const"?

我们知道"const变量"表示一旦分配,就无法更改变量,如下所示:

int const i = 1;
i = 2;
Run Code Online (Sandbox Code Playgroud)

上面的程序将无法编译; gcc提示错误:

assignment of read-only variable 'i'
Run Code Online (Sandbox Code Playgroud)

没问题,我能理解,但下面的例子超出了我的理解:

#include<iostream>
using namespace std;
int main()
{
    boolalpha(cout);
    int const i = 1;
    cout << is_const<decltype(i)>::value << endl;
    int const &ri = i;
    cout << is_const<decltype(ri)>::value << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它输出

true
false
Run Code Online (Sandbox Code Playgroud)

奇怪的.我们知道,一旦引用绑定到名称/变量,我们就无法更改此绑定,我们更改其绑定对象.所以我认为类型ri应该是相同的i:什么时候iint const,为什么ri不是const

c++ const reference decltype language-lawyer

85
推荐指数
5
解决办法
5733
查看次数

删除指向const的指针(T const*)

我有一个关于const指针的基本问题.我不允许使用const指针调用任何非const成员函数.但是,我可以在const指针上执行此操作:

delete p;
Run Code Online (Sandbox Code Playgroud)

这将调用类的析构函数,它实质上是一个非const'方法'.为什么允许这样做?它只是支持这个:

delete this;
Run Code Online (Sandbox Code Playgroud)

还是有其他原因吗?

c++ const delete-operator

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

关键字'const'不会使值不可变.这是什么意思?

Axel Rauschmayer博士在Exploring ES6中const定义:

const像let一样工作,但是你声明的变量必须立即初始化,其值不能随后改变.[...]

const bar = 123;
bar = 456;  // TypeError: `bar` is read-only
Run Code Online (Sandbox Code Playgroud)

然后他写道

陷阱:const不会使值不可变

const 仅表示变量始终具有相同的值,但并不意味着值本身是或变为不可变的.

我对这个陷阱感到困惑.任何人都可以清楚地定义const这个陷阱吗?

javascript const ecmascript-6

83
推荐指数
3
解决办法
7293
查看次数

为什么const成员函数可以修改静态数据成员?

在以下C++程序中,从函数修改静态数据成员const工作正常:

class A 
{
  public:   
    static int a; // static data member

    void set() const
    {
        a = 10;
    }
};
Run Code Online (Sandbox Code Playgroud)

但是从函数修改非静态数据成员const不起作用:

class A 
{
  public:   
    int a; // non-static data member

    void set() const
    {
        a = 10;
    }
};
Run Code Online (Sandbox Code Playgroud)

为什么const成员函数可以修改static数据成员?

c++ static const function c++11

82
推荐指数
3
解决办法
6570
查看次数

为什么STL映射的[]运算符不是?

举例说明,为了这个问题:

void MyClass::MyFunction( int x ) const
{
  std::cout << m_map[x] << std::endl
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为[]运算符是非const的.

这很不幸,因为[]语法看起来很干净.相反,我必须做这样的事情:

void MyClass::MyFunction( int x ) const
{
  MyMap iter = m_map.find(x);
  std::cout << iter->second << std::endl
}
Run Code Online (Sandbox Code Playgroud)

这一直困扰着我.为什么[]运算符是非常量的?

c++ const

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

在文件范围内可变修改的数组

我想创建一个在我的Objective-C实现文件中使用的常量静态数组,类似于我的".m"文件的顶层.

static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = { 
  1,
  2, 
  3, 
  4 };
Run Code Online (Sandbox Code Playgroud)

我打算NUM_TYPES稍后在文件中使用,所以我想把它放在一个变量中.

但是,当我这样做时,我得到了错误

"在文件范围内修改了'类型'"

我认为这可能与数组大小是变量有关(当我在那里放一个整数文字时,我不会收到此消息static int types[4]).

我想解决这个问题,但也许我说这一切都错了......我在这里有两个目标:

  1. 拥有一个可在整个文件中访问的数组
  2. 要封装NUM_TYPES到变量中,所以我的文件中的不同位置没有相同的文字

有什么建议?

[编辑]在C Faq中找到了这个:http://c-faq.com/ansi/constasconst.html

c arrays static const objective-c

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

在Objective-C中#define vs const

我是Objective-C的新手,我有一些关于const和预处理指令的问题#define.

首先,我发现无法使用定义常量的类型#define.这是为什么?

第二,使用其中一个比另一个更有优势吗?

最后,哪种方式更有效和/或更安全?

const objective-c c-preprocessor

81
推荐指数
4
解决办法
8万
查看次数

为什么我可以在javascript中更改常量的值

我知道ES6还没有标准化,但是很多浏览器目前都支持 const JS中的关键字.

在规范中,它写道:

常量的值不能通过重新赋值来改变,并且不能重新声明常量.因此,尽管可以在不初始化的情况下声明常量,但这样做是没用的.

当我做这样的事情时:

const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];
Run Code Online (Sandbox Code Playgroud)

我看到一切正常xxx6yyy[].

但是,如果我这样做yyy.push(6); yyy.push(1);,我的常数阵列已被改变.现在它是[6, 1],顺便说一句,我仍然无法改变它yyy = 1;.

我这是一个错误,还是我错过了什么?我用最新的chrome和FF29试了一下

javascript const ecmascript-6

80
推荐指数
6
解决办法
4万
查看次数

参数可以不变吗?

我正在寻找与Java相当的C#final.它存在吗?

C#是否包含以下内容:

public Foo(final int bar);
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,bar是一个只读变量,不能更改Foo().有没有办法在C#中做到这一点?

比如,也许我还有很长的方法,将与其合作x,yz一些对象(整数)的坐标.我想绝对肯定该函数不会以任何方式改变这些值,从而破坏数据.因此,我想宣读它们.

public Foo(int x, int y, int z) {
     // do stuff
     x++; // oops. This corrupts the data. Can this be caught at compile time?
     // do more stuff, assuming x is still the original value.
}
Run Code Online (Sandbox Code Playgroud)

c# const parameter-passing readonly

79
推荐指数
6
解决办法
4万
查看次数