Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++ 为什么我可以通过引用修改常量返回?_C++ - Fatal编程技术网

C++ 为什么我可以通过引用修改常量返回?

C++ 为什么我可以通过引用修改常量返回?,c++,C++,考虑以下代码: std::unordered_map<std::string, std::string> test; test.insert(std::unordered_map<std::string, std::string>::value_type("test", "123")); std::string& x = test.at("test"); x += "hi"; std::cout << x << ", " <<

考虑以下代码:

std::unordered_map<std::string, std::string> test;
test.insert(std::unordered_map<std::string, std::string>::value_type("test", "123"));
std::string& x = test.at("test");
x += "hi";
std::cout << x << ", " << test.at("test") << std::endl;
std::无序映射测试;
插入(标准::无序映射::值类型(“测试”,“123”);
std::string&x=test.at(“test”);
x+=“hi”;
标准::cout
无序映射::at
返回常量引用

不,没有。它有两个重载:一个常量,一个非常量。您正在使用非常量重载

无序映射::at
返回常量引用


不,没有。它有两个重载:一个常量,一个非常量。您正在使用非常量重载。

std::unordered_set::at
有两个重载,一个用于
const
-限定实例,另一个用于非
const
-限定实例。用于
const
限定实例的重载确实返回不可修改的
const
引用。试试这个:

const std::unordered_map<std::string, std::string> test = {{"test", "123"}};
// ^^ Note the const-specifier

std::string& x = test.at("test"); // No way, compiler will complain
const std::无序映射测试={{“test”,“123”};
//^^请注意常量说明符
std::string&x=test.at(“test”);//不可能,编译器会抱怨的

此示例显示
std::unordered_set::at
const
版本的返回值甚至不能绑定到非
const
引用,更不用说正在修改的引用了。

std::unordered_set::at
有两个重载,一个用于
const
-限定实例,一个用于非
const
-限定实例。一个用于
const
-限定实例确实返回不可修改的
const
引用。试试这个:

const std::unordered_map<std::string, std::string> test = {{"test", "123"}};
// ^^ Note the const-specifier

std::string& x = test.at("test"); // No way, compiler will complain
const std::无序映射测试={{“test”,“123”};
//^^请注意常量说明符
std::string&x=test.at(“test”);//不可能,编译器会抱怨的

此示例显示
std::unordered_set::at
const
版本的返回值甚至不能绑定到非
const
引用,更不用说正在修改的引用了。

既有
const
版本的
at()
@AdrianW在您发表评论之前,已在正确的位置(即答案部分)提供了此信息。请避免在评论中回答。您是否将链接到的页面上第一个重载上的注释误读为“直到C++11”?有
const
和非
const
版本的
at()。请避免在评论中回答。您是否将链接页面上第一个重载上的注释误读为“直到C++11”?