我试图使用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 …
我们知道"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:什么时候i是int const,为什么ri不是const?
我有一个关于const指针的基本问题.我不允许使用const指针调用任何非const成员函数.但是,我可以在const指针上执行此操作:
delete p;
Run Code Online (Sandbox Code Playgroud)
这将调用类的析构函数,它实质上是一个非const'方法'.为什么允许这样做?它只是支持这个:
delete this;
Run Code Online (Sandbox Code Playgroud)
还是有其他原因吗?
Axel Rauschmayer博士在Exploring ES6中有const定义:
const像let一样工作,但是你声明的变量必须立即初始化,其值不能随后改变.[...]Run Code Online (Sandbox Code Playgroud)const bar = 123; bar = 456; // TypeError: `bar` is read-only
然后他写道
const仅表示变量始终具有相同的值,但并不意味着值本身是或变为不可变的.
我对这个陷阱感到困惑.任何人都可以清楚地定义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数据成员?
举例说明,为了这个问题:
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)
这一直困扰着我.为什么[]运算符是非常量的?
我想创建一个在我的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]).
我想解决这个问题,但也许我说这一切都错了......我在这里有两个目标:
NUM_TYPES到变量中,所以我的文件中的不同位置没有相同的文字有什么建议?
[编辑]在C Faq中找到了这个:http://c-faq.com/ansi/constasconst.html
我是Objective-C的新手,我有一些关于const和预处理指令的问题#define.
首先,我发现无法使用定义常量的类型#define.这是为什么?
第二,使用其中一个比另一个更有优势吗?
最后,哪种方式更有效和/或更安全?
我知道ES6还没有标准化,但是很多浏览器目前都支持 const JS中的关键字.
在规范中,它写道:
常量的值不能通过重新赋值来改变,并且不能重新声明常量.因此,尽管可以在不初始化的情况下声明常量,但这样做是没用的.
当我做这样的事情时:
const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];
Run Code Online (Sandbox Code Playgroud)
我看到一切正常xxx仍6和yyy是[].
但是,如果我这样做yyy.push(6); yyy.push(1);,我的常数阵列已被改变.现在它是[6, 1],顺便说一句,我仍然无法改变它yyy = 1;.
我这是一个错误,还是我错过了什么?我用最新的chrome和FF29试了一下
我正在寻找与Java相当的C#final.它存在吗?
C#是否包含以下内容:
public Foo(final int bar);
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,bar是一个只读变量,不能更改Foo().有没有办法在C#中做到这一点?
比如,也许我还有很长的方法,将与其合作x,y和z一些对象(整数)的坐标.我想绝对肯定该函数不会以任何方式改变这些值,从而破坏数据.因此,我想宣读它们.
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)