gpt4 book ai didi

C++、decltype 和 constness 错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:17 25 4
gpt4 key购买 nike

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

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&}”的引用 返回基础[e];)

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

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

最佳答案

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

与此同时,您的成员函数 func声明为 const .意思是成员(member)base会有const Base在该成员函数中键入。这反过来意味着运算符 [] 的应用至 base将引用 operator [] 的 const 版本. []的那个版本返回 const vector<int> & 的结果类型。

所以,你的 return语句试图隐式转换 const vector<int> & vector<int> & 的值值(value)。此转换无效。它违反了常量正确性规则。

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

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

要么这个要么那个。

关于C++、decltype 和 constness 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17185045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com