为什么这种类型别名中的const限定符被删除了?

Tim*_*imo 4 c++ qualifiers c++17

TL; DR

给定以下类型:

struct A
{
    std::vector<std::string> vec;

    using reference = std::iterator_traits<decltype(vec)::iterator>::reference;
    using const_reference = const reference;
};
Run Code Online (Sandbox Code Playgroud)

为什么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];
    }
};
Run Code Online (Sandbox Code Playgroud)

通过删除const限定符,我实际上返回了一个foo非法的引用,因为它是一个const成员函数,所以编译器抛出.

Bo *_*son 7

丢弃了.我们称之为"const引用"实际上是对const的引用const int&.

有一个int&和添加const会做到这一点int& const.但这样的const被删除了.

你的问题类似于const int*和之间的区别int* const.除了参考,int&并且int& const是相同的类型 - const被忽略.

  • @Timo - 那可能会奏效.我会使用`std :: vector <std :: string> :: const_reference`并避免使用杂乱的链锯. (2认同)