在使用指针时,const以何种方式干扰标记更专业的模板
In what way const is interfering with marking a more specialized template when using pointers?
我有这个工作代码:
template <typename X, typename Y>
auto f(X a, Y b) { return a + b; };
template <typename X, typename Y>
auto f(X* a, Y* b) { return *a + *b; };
int main() {
int* p;
int* q;
f(p, q);
}
它编译并运行第二f()
,因为它更专业。
然而,如果我们const
-限定这样的参数:
template <typename X, typename Y>
auto f(const X a, const Y b) { return a + b; };
template <typename X, typename Y>
auto f(const X* a, const Y* b) { return *a + *b; };
int main() {
int* p;
int* q;
f(p, q);
}
它不再工作,并尝试选择第一个函数,在指针的a + b
上出错。
为什么const
-限定类型会使第二个模板不再更加专业化?
为什么
const
限定类型使第二个模板不再更加专业化?
没有
";"问题";我们在这里观察到的是,在检查什么类型更专业之前,重载解析会考虑一些因素。
阅读部分最佳可行函数,我们可以看到:
对于每对可行函数F1和F2,对从第
i
个参数到第i
个参数的隐式转换序列进行排序,以确定哪一个更好(除了第一个参数,静态成员函数的隐式对象参数对排序没有影响(如果F1的所有自变量的隐式转换不比F2[…]的所有自变量隐式转换差,则F1被确定为比F2更好的函数
现在让我们看看这两个重载:
template <typename X, typename Y>
auto f(const X a, const Y b) { return a + b; };
int main() {
int* p;
int* q;
f(p, q);
}
这里是CCD_ 8和CCD_。无需转换。值得指出的是,a
和b
的类型不是const int*
,而是int* const
。
现在让我们来看看第二个过载:
template <typename X, typename Y>
auto f(const X* a, const Y* b) { return *a + *b; };
int main() {
int* p;
int* q;
f(p, q);
}
这里,为了从int*
(即p
和q
的类型(获得const int*
(所需的自变量类型(,必须将X
和Y
推导为int*
,然后必须进行转换。这是因为const int*
并不意味着指向int
的const
指针,而是指向const int
指向const int
的指针和指向int
的指针不相同,但后者可以转换为前者。在这种情况下,CCD_ 27和CCD_。
因此,过载解析会选择转换较少的候选者。该重载试图添加两个指针,结果导致编译时错误。
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- AddDllDirectory会干扰后续的LoadLibraryExW
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 不同/较旧的处理器运行c++代码的方式是否不同
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 重载方法的方式会在使用临时调用时生成编译器错误
- 在reactor中存储eventHandlers的最佳方式是什么
- 如何以优化的方式同时迭代两个间距不相等的数组
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 为什么C++有不同的变量初始化方式?
- 在AVX通道中混洗的最佳方式
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- 如何以静态代码分析友好的方式使用 #define 防护?