Const正确性建议

时间:2018-05-14 11:00:19

标签: c++ const

我有一个接收const引用的函数,我需要使用这个引用来调用模板库函数:

std::vector<cv::Size> get_resolutions(const rs2::device& dev)
{
    auto sensor = dev.first<rs2::depth_sensor>();

    //more code    
}


class device
{
public:

    template<class T>
    T first()
    {
        for (auto&& s : query_sensors())
        {
            if (auto t = s.as<T>()) return t;
        }
        throw rs2::error("Could not find requested sensor type!");
    }

    //more code

};

当我使用gcc编译时,我收到此错误:

错误:将'const rs2 :: device'作为'this'参数传递丢弃限定符[-fpermissive]

我无法更改first()函数,因为它是外部库的一部分(librealsense,here中的第51行)。 我无法从函数参数dev中删除const,因为这将导致在很多地方删除const正确性。

我可以通过从dev:

中删除const来克服错误
auto sensor = const_cast<rs2::device&>(dev).first<rs2::depth_sensor>();

然而,这感觉不好。有没有更正确的方法来处理这个错误?我尝试了以下变化失败:

auto sensor = dev.first<const rs2::depth_sensor>();
auto sensor = const_cast<const rs2::depth_sensor>(dev.first<rs2::depth_sensor>());

但我得到同样的错误。

1 个答案:

答案 0 :(得分:4)

我认为有两种可能的解决方案。您允许get_resolutions通过非const引用获取dev(尽管可能需要您在调用站点修改代码),或者您自己重新实现first

选项1

只需替换

std::vector<cv::Size> get_resolutions(const rs2::device& dev)

std::vector<cv::Size> get_resolutions(rs2::device& dev)

但是,这也意味着您不能再使用临时对象调用get_resolutions

选项2

然而,看看source of the library,我真的看不出为什么first()是非常量的。所有这一切都是调用query_sensors() const-qualified,也是公开的),并处理结果: 1

template<class T>
T first()
{
    for (auto&& s : query_sensors())
    {
        if (auto t = s.as<T>()) return t;
    }
    throw rs2::error("Could not find requested sensor type!");
}

这可能是影响最小的选项:只需在库外部定义一个复制此功能的first()

template <class T>
T custom_first(const rs2::device& dev)
{
    for (auto&& s : dev.query_sensors())
        if (auto t = s.as<T>())
            return t;
    throw rs2::error("Could not find requested sensor type!");
}

1 提交错误报告的时间可能吗?