gpt4 book ai didi

c++ - 在 Itanium C++ ABI 中,为什么模板函数的错误名称无法解析依赖的 typedef?

转载 作者:IT老高 更新时间:2023-10-28 21:43:13 25 4
gpt4 key购买 nike

例如:

template <typename T>
struct foo
{
using bar = int;
};

// _Z3bazi
void baz(foo<int>::bar quux) {
}

template <typename T>
void baz(typename foo<T>::bar quux) {
}

// _Z3bazIiEvN3fooIT_E3barE
template void baz<int>(foo<int>::bar quux);

为什么 baz<int> 的格式不正确?提foo有吗?怎么不是_Z3bazIiEvi ?

这显然是 C++17 std::default_order<T> 的原因。提案已死在水中。

最佳答案

问题来自 <unresolved-name>在 ABI 中构建。为什么我们要使用未解析的名称?这都是关于声明匹配和重载的。 C++14 §14.5.6.1/3 注释,

Two distinct function templates may have identical function return types and function parameter lists, even if overload resolution alone cannot distinguish them.

你可以在不同的文件中拥有另一个函数,

template <typename T>
void baz(int quux) { std::abort(); }

虽然此签名不能和平共存于同一个文件中——由于重载歧义而无法命名——但它可以存在于不同的文件中,因此需要进行不同的修改。

(即使是这种级别的共存也不是所有模板的标准都保证的。编译器使用函数模板声明的确切形式来执行声明匹配是 QOI 的问题,因此将声明复制粘贴到定义将倾向于提供完全匹配,并且不会与解析为相同签名的另一个函数模板发生令人惊讶的冲突。请参阅 §14.5.6.1/5-6。)

至于 default_order 下雨的游行,问题在于模板ID隐式地从模板中提取默认参数。因此,用户可能会无意中在签名中包含依赖类型名,只需提及 std::set .

关于c++ - 在 Itanium C++ ABI 中,为什么模板函数的错误名称无法解析依赖的 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40157489/

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