c++ - 为什么删除此类型别名中的 const 限定符?

标签 c++ c++17 qualifiers

<分区>

长话短说

给定以下类型:

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)作为模板参数。我需要从这些迭代器中推导出引用和常量引用类型,因为我有一些成员函数,例如:

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 成员函数,因此编译器会抛出异常。

最佳答案

丢弃了。我们所说的“const 引用”实际上是对 const 的引用 - const int&

拥有一个 int& 并添加 const 将生成 int& const。但是这样的 const 被丢弃了。

你的问题类似于const int*int* const的区别。除了对于引用,int&int& const 是相同的类型 - const 被忽略。

关于c++ - 为什么删除此类型别名中的 const 限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50470435/

相关文章:

c++ - gdb: <error reading variable> with c++ vector

c++ - 是否将 “flags”常量视为好样式? (C++)

java - spring-context 是否支持 bean 实例上的 JSR-330 限定符?

c - C中的双指针const正确性警告

c++ - 重载解析和指向 const 的共享指针

c++ - 部分覆盖虚函数

c++ - 为 std::strings 重载运算符+ - 一个坏主意?

c++ - 如何在外语和返回共享指针的 C++ 库之间进行接口(interface)

C++17 标准库包括不在 Visual Studio 2017 中使用 Android 项目

c++ - 没有前向声明的嵌套函数模板实例在 GCC 上编译,但不在 clang 上编译