【发布时间】:2018-11-01 09:13:46
【问题描述】:
TL;DR
给定以下类型:
struct A
{
std::vector<std::string> vec;
using reference = std::iterator_traits<decltype(vec)::iterator>::reference;
using const_reference = const reference;
};
为什么是reference == const_reference?为什么const 限定符被丢弃在第二类别名中?
请参阅 godbold 上不应编译的示例。
详情
我有一个模板类,它接受一堆迭代器(-types)作为模板参数。从这些迭代器中,我需要推断出引用和 const 引用类型,因为我有一些成员函数,例如:
struct A
{
std::vector<std::string> vec;
using reference = std::iterator_traits<decltype(vec)::iterator>::reference;
using const_reference = const reference;
const_reference foo() const
{
return vec[0];
}
};
通过删除 const 限定符,我有效地返回了 foo 中的引用,这是非法的,因为它是一个 const 成员函数,因此编译器会抛出异常。
【问题讨论】:
-
reference是string&。const reference其实就是string& const -
编译器实际上给了你一个非常明确的警告:"'const' 对引用类型 'A::reference' (aka ...) 的限定符没有效果 [-Wignored-qualifiers] "
-
@Peter 但是
iterator_traits没有const_reference类型。 -
@Holt 是的,我看到了那个警告,但我不知道为什么它会弹出。
标签: c++ c++17 qualifiers