当返回类型为const时,为什么可以修改返回值?

Jes*_*ica 2 c++ const return-type return-value

我的印象是,通过声明返回类型const,您可以防止修改数据结构.但是,我测试了这个,我可以修改数据结构.这是为什么?

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 7

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

const返回值的限定符意味着您无法直接修改它,例如

f().insert(6); // fail
Run Code Online (Sandbox Code Playgroud)

  • 我想知道const是否会阻止复制省略? (2认同)
  • @MM似乎不会阻止[NRVO](http://en.cppreference.com/w/cpp/language/copy_elision)."并且它具有与函数的返回类型相同的类型(忽略顶级cv资格),..."[用于测试的实时演示](https://wandbox.org/permlink/RIwH6rw5w8D2qWm7) (2认同)