C++, decltype and constness error

C++, decltype and constness error

本文关键字:constness error and decltype C++      更新时间:2023-10-16

我不明白为什么下面的代码是错误的。

struct A{
    typedef std::vector<std::vector<int>> Base;
    // const auto& func(std::size_t e) const
    auto func(std::size_t e) const -> decltype(std::declval<Base>()[e])
    {
            return base[e];
    }
    Base base;
};

在gcc 4.8.1中,我得到了上面代码段的编译错误。__gnu_cxx::__alloc_traits>>::value_type&{aka std::vector&}'从类型'const value_type {aka const std::vector}'的表达式Return base[e];)

请注意,如果我删除const限定符,它会正常工作。

但是,如果我将函数签名的部分替换为注释的部分(使用c++ 14中引入的自动类型推导)。无错误产生。所以,我猜decltype部分是错误的

由于Base为非const类型,因此std::declval<Base>()[e]std::vectoroperator[]的非const版本。该版本的[]返回std::vector<int> &类型的非const引用。因此,函数的返回类型声明为decltype(std::declval<Base>()[e]),即std::vector<int> &

同时,成员函数func被声明为const。这意味着成员base将在该成员函数中具有const Base类型。这就意味着操作符[]base的应用将引用operator []的const版本。该版本的[]返回const vector<int> &类型的结果。

因此,您的return语句试图隐式地将const vector<int> &值转换为vector<int> &值。此转换无效。它违反了常量正确性规则。

在返回类型中添加const,如@catscradle所建议的。或者从方法声明中删除const

auto func(std::size_t e) -> decltype(std::declval<Base>()[e])

这行得通:

auto func(std::size_t e) const -> decltype(std::declval<const Base>()[e])
相关文章: