You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C++中non-const iterator绑定到const_iterator&的标准合规性及编译器行为差异问询

C++中non-const iterator绑定到const_iterator&的标准合规性及编译器行为差异问询

各位好,我碰到了一个C++代码在不同编译器下行为不一致的问题,想请教下符合标准的正确处理方式应该是怎样的。

先贴出我的测试代码:

#include <string>
#include <iostream>

void f(std::string::const_iterator& p)
{
    ++p;
}

int main ()
{
    std::string s{"ABCD"};

    std::string::const_iterator ps = s.begin();
    f(ps);
    std::cout <<"ps= " << *ps <<std::endl;

    std::string::iterator qs = s.begin();
    f(qs);                    //<--- clang 和 gcc 在此行报告错误
    std::cout <<"qs= " << *qs <<std::endl;

    return 0;
}

问题详情:
这段代码用clang和gcc编译时,上面标注的那一行会报错,但用MSVC编译却能正常通过并运行。

我想知道:按照C++语言标准,这里的正确行为应该是什么样的?

另外说下我个人的看法:我觉得MSVC的处理是正确的。注意在ps = s.begin();这一行,所有编译器都能正确地将non-const iterator转换为const iterator,那同样的规则应该也适用于引用绑定的场景吧?

还有一个后续问题:如果gc...(此处内容未补充完整)


备注:内容来源于stack exchange,提问作者Mircea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 13:25:32