- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在编译以下示例时遇到了一个奇怪的问题。
template<typename T>
struct identity {
typedef T type;
};
template<typename T>
void foo(typename identity<T>::type v) {}
template<typename T>
void foo(typename identity<T>::type* v) {}
int main() {
foo<int>(0);
foo<short>(0);
return 0;
}
调用 foo<int>(0)
编译,但是,当我调用 foo<short>(0)
,编译器无法推断 0 是值还是指针。我使用 identity 来强制显式指定模板参数。编译器(msvc)错误信息:
error C2668: 'foo': ambiguous call to overloaded function
是否是编译器错误?
最佳答案
它不是编译器错误。这是因为将 0 转换为指针类型具有“转换等级”这一事实。
C++11 §4.10(转换等级)
A null pointer constant is an integer literal (2.13.2) with value zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of object pointer or function pointer type. Such a conversion is called a null pointer conversion.
因此,当您编写 0 字面量并且需要进行转换 时,编译器会遇到两个等级相似的重载 - 一个是非指针类型,另一个是指针类型。
更多例子:
foo<short>((short)0); // No conversion necessary: allowed
foo<nullptr_t>(nullptr); // No conversion necessary: allowed
foo<nullptr_t>(0); // ambiguous
foo<nullptr_t>(NULL); // ambigious - another reason to stop using NULL
关于c++ - 0 的模板函数模棱两可的参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914051/
我从一所大学获得了一些示例代码,导入了项目并尝试运行测试:方法 assertThat(Integer, Matcher) 对于 MyClass 类型是不明确的 每个 assertThat 都被标记为红
关于将 iOS 应用程序迁移到 Swift 3.0 的过程。这是我面临的一个问题。 先上相关代码: let calendar = NSCalendar.current, calendCompo = c
我刚开始研究 Java 8 Lambda 功能。我在 Java 7 中编写了这段代码,并尝试在 lamdas 中执行它。请注意,最后一行会产生编译错误,因为重载的函数不明确。我明白原因。如何使用 la
如何优先(告诉编译器)使用“函数接收引用”(#B)而不是“函数接收值”(#A)? #include using namespace std; class Heavy{/* ...... */}; /
我正在使用 Google Map API V3 显示车辆行驶路径及其路线方向。但是通过谷歌方向图标,很难找到方向。下图解释更多 我看到了每个图标,它是 source 我找到了图片路径,是 http:/
我是一名优秀的程序员,十分优秀!