unordered_set/map自定义哈希函数

今天在使用C++中的unordered_map的时候遇到一个小问题。我试图将std::pair<int, int>作为键放到unordered_map中,结果编译器无情地报错。众所周知,一旦模板类编译出错,错误信息一般都要几十行甚至数百行,在其中“徜徉”了许久之后,我发现下面的错误信息可能对我会有帮助:

error: no match for call to '(const std::hash<std::pair<int, int> >) (const std::
pair<int, int>&)'

继续阅读unordered_set/map自定义哈希函数

C++字面值操作符

g++: "error: unable to find string literal operator"
g++: "warning: invalid suffix on literal"

我:之前写的代码还能好好地编译,使用了带有C++11编译选项后编译器居然说代码有问题,肯定是编译器错了!!!

例如以下代码:

#include <cstdio>
#define _SLO_ "string literal operator."
int main()
{
    printf("Hello "_SLO_);
    return 0;
}

然而,如果在"_SLO_"前面加一个空格,又可以正确地编译了,这时为什么呢?

继续阅读C++字面值操作符

C++字符串字面值常量

在C++中,一个字符串字面值(string literal)一般是指使用双引号("")包围起来的一段字符串,例如:

const char *s = "string literal";

有时,人们习惯于写成 char *s = "string literal",实际上这是不对的,因为C++中的字符串字面值是一个常量,将一个常量直接赋值给一个非const变量可能会造成不可预知的行为,例如:

char *s = "ttring literal";
s[0] = 's'; // undefined behavior

继续阅读C++字符串字面值常量