【问题标题】:Why is it possible to modify a returned value when the return type is const?为什么返回类型为 const 时可以修改返回值?
【发布时间】:2017-06-08 09:14:40
【问题描述】:

我的印象是,通过声明返回类型const,可以防止数据结构被修改。但是,我对此进行了测试,并且可以修改数据结构。这是为什么呢?

例如,以下代码在使用--std=c++11 编译时打印1 2 3 4 5 6

#include <iostream>
#include <set>

using namespace std;
const set<int> f(void) {
    set<int> s = {1, 2, 3, 4, 5};
    return s;
}
int main(void) {
    set<int> s = f();
    s.insert(6);

    for (auto elem: s) {
        cout << elem << " ";
    }
    return 0;
}

【问题讨论】:

标签: c++ constants return-value return-type


【解决方案1】:

因为s 是从返回值构造的不同对象。它与返回的对象无关,它本身就是一个非常量对象。

返回值的const 限定符意味着你不能直接修改它,比如

f().insert(6); // fail

【讨论】:

  • @M.M 似乎不会阻止NRVO。 “并且与函数的返回类型具有相同的类型(忽略顶级 cv 限定),...”live demo for test
猜你喜欢
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 2017-06-20
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
相关资源
最近更新 更多