为什么C++不能(或不会)推导别名模板?

eivgtgni  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(73)

C++似乎不能或不愿意为基本整数类型的模板别名推断模板参数。
下面是一个相对简单的例子:

#include <stdint.h>

template<typename T>
using IntPtr = intptr_t;

template<typename T>
T* getPtr(IntPtr<T> i)
{
    return (T*) i;
}

int main()
{
    IntPtr<char> char_star = 0xcafe'babe'dead'beef;
    return *getPtr(char_star);
}

字符串
尝试编译上面的代码会出现以下错误:

$ clang -xc++ -std=c++20 why.cc
why.cc:17:13: error: no matching function for call to 'getPtr'
    return *getPtr(char_star);
            ^~~~~~
why.cc:8:4: note: candidate template ignored: couldn't infer template argument 'T'
T* getPtr(IntPtr<T> i)
   ^
1 error generated.


我试过各种不同的C标准版本,包括c2b,但结果总是一样的。

voase2hg

voase2hg1#

template<typename T>
using IntPtr = intptr_t;

字符串
T不能从intptr_t推导出来,所以这是不可能的。
IntPtr<char>intrptr_t,所以你要求编译器从intrptr_t推导出T,这根本不可能做到。
你可以这样写:

template<typename T>
T* getPtr(std::intptr_t i)
{
    return reinterpret_cast<T*>(i);
}

// ...
getPtr<char>(0xcafe'babe'dead'beef);

相关问题