今天我正在阅读 clang 的 C++17 支持页面。我注意到一些奇怪的事情。特点将模板模板参数与兼容的参数相匹配 (P0522R0) 被标记为部分,因为它必须通过开关激活。他们的笔记says:
尽管是缺陷报告的解决方案,但该功能在所有语言版本中默认处于禁用状态,并且可以在 Clang 4 中使用标志 -frelaxed-template-template-args 显式启用。对标准的更改缺少相应的更改对于模板部分排序,导致合理且先前有效的代码出现歧义错误。预计该问题将很快得到纠正。
当这个功能被激活时,什么样的结构会被破坏?为什么它可以破译代码以及如何破译?
你可以有这样的代码:
template<template<typename> typename>
struct Foo {};
template<typename, typename = void>
struct Bar {};
Foo<Bar> unused;
如果没有缺陷解决方案,unused
会是格式错误的,因为foo
采用只有一个模板参数的模板,而不是两个。如果您依赖于此(也许对于 SFINAE):
template<template<typename> typename>
void foo();
template<template<typename, typename> typename>
void foo();
template<typename, typename = void>
struct Bar {};
int main() {
foo<Bar>(); // ambiguous after resolution!
}
那么调用就会失败!问题在于,部分排序没有相应的更改,因此两个候选函数具有相同的可行性,并且调用不明确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)