2

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

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 中收到上述代码段的编译错误。(错误:从'const value_type {aka const std::vector}'类型的表达式中对'__gnu_cxx::__alloc_traits >>::value_type& {aka std::vector&}'类型的引用无效初始化返回base[e];)

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

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

4

2 回答 2

3

由于Base是非常量类型,因此std::declval<Base>()[e]指的operator[]std::vector. 该版本[]返回 type 的非常量引用std::vector<int> &。因此,您的函数的返回类型声明为decltype(std::declval<Base>()[e]),即std::vector<int> &.

同时,您的成员函数func被声明为const. 这意味着该成员baseconst Base在该成员函数内具有类型。这反过来意味着 operator []to的应用程序base将引用 的 const 版本operator []。该版本[]返回const vector<int> &类型的结果。

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

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

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

不管是这个还是那个。

于 2013-06-19T07:54:11.117 回答
1

这有效:

auto func(std::size_t e) const -> decltype(std::declval<const Base>()[e])
于 2013-06-19T07:38:13.983 回答