【发布时间】:2020-04-12 14:39:49
【问题描述】:
据我了解,const 指针函数参数应该能够接受 const 和非 const 指针。在后一种情况下,通过指针修改值是非法的。
假设我有以下模板函数
template <typename T1, typename T2>
decltype(auto) plus(T1 a, T2 b) {
return a + b;
}
template <typename T1, typename T2>
decltype(auto) plus(const T1* a, const T2* b) {
return *a + *b;
}
int main() {
int a {2}, b {3};
std::cout << plus(a, b) << std::endl;
int *first { new int {2} }, *second { new int {3} };
// it seems here that the return type is deduced to be void*?
std::cout << plus(first, second) << std::endl;
}
第二个函数调用正确调用了plus模板函数,该函数接受指针参数但推断返回类型为void*
但是,如果我将模板签名更改为
template <typename T1, typename T2>
decltype(auto) plus(T1* a, T2* b) {
return *a + *b;
}
这会产生正确的结果。
这是怎么回事?
【问题讨论】:
-
它不会像您声称的那样调用第二个重载。它调用第一个更好的匹配(因此模板部分排序无关紧要)然后应该失败,因为添加指针没有明确定义,请参阅godbolt.org/z/djBS_k
-
它调用第一个重载。错误消息 说 将表达式推导出为
void但这是由于表达式格式错误且没有意义。 -
@walnut 正在添加通常没有为模板定义好的指针,或者没有为自动类型推导定义好的指针?
-
@MutatingAlgorithm 在 C++ 中永远不能添加两个指针。它应该始终生成错误消息。
-
正如已经指出的那样,添加两个指针不是格式良好的 C++。如果你的编译器真的接受这个代码(它不应该),你应该向你的编译器供应商报告这个错误......
标签: c++ pointers templates decltype