Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态常量int作为映射下标_C++ - Fatal编程技术网

C++ 静态常量int作为映射下标

C++ 静态常量int作为映射下标,c++,C++,我遇到了一个奇怪的问题。 考虑到这个例子: class Foo { static const int Bar = 5; public: Foo() { _map[Bar] = "some characters"; } ~Foo() {} private: std::map<int, std::string> _map; }; int main() { Foo a; return (0); } 现在,如果我在条上进行静态_转换,它会起

我遇到了一个奇怪的问题。 考虑到这个例子:

class Foo
{
  static const int Bar = 5;

public:
  Foo()
  {
    _map[Bar] = "some characters";
  }

  ~Foo() {}

private:
  std::map<int, std::string> _map;
};

int main()
{
  Foo a;

  return (0);
}
现在,如果我在条上进行静态_转换,它会起作用:

Foo()
{
  int i = Bar; //works
  _map[static_cast<int>(Bar)] = "some characters"; //works
}
Foo()
{
int i=Bar;//有效
_map[static_cast(Bar)]=“一些字符”;//作品
}

仅当在构造函数中将
条形图
用作贴图下标时,才会出现此错误。编写
\u映射[条]=“一些字符”不会产生任何错误

这对我来说真的很奇怪,但我希望这里有人能给出答案


那么,我做错了什么?

那是因为
map::operator[]
将其键作为
int常量&
。它需要你传递给它的东西的地址。当您这样做时:

_map[static_cast<int>(Bar)]
Bar
实际上没有内存存储。您需要通过以下方式提供:

class Foo {
    ....
};

const int Foo::Bar;

您需要在顶层添加以下内容,以便为
Foo::Bar
分配存储:

const int Foo::Bar;

写入常量int Foo::Bar=5;在你的主要课程之前,但不是在课堂上;)类似地,
\u map[+Bar]
也可以工作。一元
+
调用从左值到右值的转换(以及整数升级)。这将创建一个临时命令,该命令可在不使用ord的情况下使用
Bar
“此错误仅在将Bar用作构造函数中的映射下标时出现。”。注意:如果违反标准(ODR)中的此规则,则不需要任何诊断。根据标准,
Foo::Bar
static_cast(Bar)
中不使用ODR,因为
Bar
可以在常量表达式中显示,并且在
static_cast
中应用了左值到右值的转换。但是,
Bar
直接绑定到
const int&
,因此不应用左值到右值的转换-这是一种odr使用,需要定义
Bar
class Foo {
    ....
};

const int Foo::Bar;
const int Foo::Bar;