c – P0522R0如何破坏代码?
作者:互联网
今天我正在阅读clang的C 17支持页面.我注意到一些奇怪的事情.功能匹配模板模板参数与兼容参数(P0522R0)标记为部分,因为它必须通过开关激活.他们的说明says:
Despite being the the resolution to a Defect Report, this feature is disabled by default in all language versions, and can be enabled explicitly with the flag -frelaxed-template-template-args in Clang 4. The change to the standard lacks a corresponding change for template partial ordering, resulting in ambiguity errors for reasonable and previously-valid code. This issue is expected to be rectified soon.
激活此功能后会出现什么样的构造?为什么它会破坏代码?
解决方法:
您可以使用以下代码:
template<template<typename> typename>
struct Foo {};
template<typename, typename = void>
struct Bar {};
Foo<Bar> 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!
}
然后电话会失败!问题是部分排序没有相应的变化,因此两个候选函数具有相同的可行性,并且调用是不明确的.
标签:c,language-lawyer,c17,clang-2 来源: https://codeday.me/bug/20190927/1824318.html