C++, decltype and constness error
C++, decltype and constness error
我不明白为什么下面的代码是错误的。
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::vector
的operator[]
的非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])
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 从不同目录执行时"symbol lookup error:",否则从构建目录执行时按预期工作
- 对象声明中的模板"error: expected expression"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- OpenCV 3.4.1 error readNetFromTensorflow 无法在 cv::d nn::ReadProtoFromBinaryFile 中打开 .pb
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 为什么我会"error: expected expression"?
- CMake Error at modules/videoio/cmake/detect_ffmpeg.cmake:16
- 如果两个静态库使用相同的另一个静态库,如何避免"LNK2005 Already Defined error"?
- C++, decltype and constness error