其他分享
首页 > 其他分享> > c – P0522R0如何破坏代码?

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