&` 到 `const 向量&`,c++,type-conversion,c++14,constants,implicit-conversion"/>

首页 > 解决方案 > 从 `vector 启用隐式转换&` 到 `const 向量&`

问题描述

假设我们定义了一个template<typename T> class vector行为类似的类,std::vector除了我们能够改变它的类定义。

还假设我们有一个函数f(const vector<T>&)

我们如何启用允许我们将 a 传递到的隐式vector<const T>&转换f


我认为这种隐式转换是明智的,因为我相信 . 施加的限制是 .const vector<T>&施加的限制的超集vector<const T>&。但任何可能具有启发性的指导将不胜感激。

标签: c++type-conversionc++14constantsimplicit-conversion

解决方案


假设这f确实是一些具体的函数T,而不是函数模板(即template<typename T> f(vector<T> const&)),那么下面的操作符vector<T>应该可以工作:

template<typename U = T, typename = std::enable_if_t<std::is_const<U>{}>>
operator vector<std::remove_const_t<U>>() const {
    // ...
}

Online Demo

但是,f它不能是一个独立的函数模板,因为它T会被简单地推断为它自己const并且不会发生转换。重载可以解决这个问题,但会很丑。

注意,这可能只是复制原件内部的元素vector;返回一个vector<T> const&以某种方式对原始内部进行别名的vector<T const>任务是一项截然不同的任务,因为它会涉及额外的生命周期管理状态和/或有问题的合法类型别名。


推荐阅读