为何std::span::operator[]未实现const reference返回?
问题
当编写如下代码:
std::vector<double> vec{1.0,2.0}; std::span<const double> s(vec); s[0]=1.0;
会得到预期的编译错误:“无法为返回值赋值,因为函数'operator[]'返回const值”。但查阅cppreference上std::span::operator[]的返回类型时,仅显示返回reference而非const reference,原本预期其返回类型为decltype(auto)。为何不会出现“未实现const reference版本的operator[]”的错误?编译器是如何确定正确返回类型的?
解答
std::span是模板类,它的模板参数包含元素类型T。当你声明std::span<const double>时,模板参数T就是const double。std::span内部定义了嵌套类型别名reference,其本质是T&。所以当T为const double时,reference就自动变成const double&——也就是你理解的“const引用版本”。- cppreference上显示的
reference是模板中的通用类型别名,并非具体返回类型。它会随着std::span的实例化参数自动适配:如果是std::span<double>,reference就是double&;如果是std::span<const double>,reference就是const double&。 - 编译器在实例化
std::span<const double>时,会将所有嵌套类型替换为对应的具体类型,因此operator[]的返回值就是const double&。这时候对返回值赋值自然触发编译错误,完全不需要单独实现一个const版本的operator[]。
内容的提问来源于stack exchange,提问作者Romain
相关产品推荐
相关产品推荐

