Ale*_*kiy 14 c++ templates language-lawyer template-meta-programming c++17
Gcc和clang似乎不同意这段代码是否应该编译:
#include <type_traits>
template <typename Signature, int N = 0>
struct MyDelegate { };
template <typename D>
struct signature_traits;
template <template <typename> class Delegate, typename Signature>
struct signature_traits<Delegate<Signature>>
{
using type = Signature;
};
static_assert(std::is_same_v<
void(int, int),
signature_traits<MyDelegate<void(int, int)>>::type
>);
Run Code Online (Sandbox Code Playgroud)
在这里查看godbolt输出并尝试一下.我在这里支持clang,但是C++标准对此有何看法?
一个后续问题 - 这可以用于铿锵声吗?
Rak*_*111 14
这是完全有效的代码,gcc是对的."功能"是在C++ 17中引入的.这不是一个真正的功能,因为它是一个缺陷报告.MyDelegate匹配部分特化signature_traits,因此它应该作为正确的gcc.请注意,它的工作原理是因为第二个模板参数是默认的.
clang之所以不编译它是因为缺陷报告有缺陷:P.它没有在部分排序中引入适当的变化,这不是很好,并且使得先前有效的代码再次变得模糊.
预计很快就会修复,但与此同时,clang决定"隐藏"旗帜背后的功能,-frelaxed-template-template-args.
所以,只需启用该标志进行编译,你应该没问题.
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |