gpt4 book ai didi

c++ - 0 的模板函数模棱两可的参数推导

转载 作者:太空狗 更新时间:2023-10-29 21:14:46 29 4
gpt4 key购买 nike

我在编译以下示例时遇到了一个奇怪的问题。

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com