kec*_*kec 6 c++ templates variadic-templates c++11
对于以下代码:
template <typename... Ts>
struct Set {};
template <typename T, typename... Ts>
using Tail = Set<Ts...>;
template <typename T, typename TS>
struct MemberOf;
template <typename T, typename... Ts>
struct MemberOf<T, Set<T, Ts...>> {
static constexpr bool value = true;
};
template <typename T>
struct MemberOf<T, Set<>> {
static constexpr bool value = false;
};
template <typename T, typename... Ts>
struct MemberOf<T, Set<Ts...>> {
static constexpr bool value = false || MemberOf<T, Tail<Ts...>>::value;
};
Run Code Online (Sandbox Code Playgroud)
g ++ 4.9.0给出:
ts.cpp:27:63: error: pack expansion argument for non-pack parameter 'T' of alias template 'template<class T, class ... Ts> using Tail = Set<Ts ...>'
static constexpr bool value = false || MemberOf<T, Tail<Ts...>>::value;
^
ts.cpp:4:11: note: declared here
template <typename T, typename... Ts>
^
ts.cpp:27:66: error: template argument 2 is invalid
static constexpr bool value = false || MemberOf<T, Tail<Ts...>>::value;
^
Run Code Online (Sandbox Code Playgroud)
clang ++ 3.4编译它没有任何诊断.它对我来说看起来像一个g ++错误,但只是想确认一下.
附录:所以,基于下面的好答案,问题似乎是pack参数必须与别名模板中的pack参数完全对应.换一种说法:
template <typename T, typename... Ts>
using Tail = Set<Ts...>;
template <typename... Ts>
using Alias1 = Tail<Ts...>; // ERROR, Ts doesn't correspond directly to the pack in Tail.
template <typename... Ts>
using Alias2 = Tail<int, Ts...>; // Okay, now it does.
Run Code Online (Sandbox Code Playgroud)
由于修复了以下错误,较新版本的clang现在也会拒绝您的代码:
http://llvm.org/bugs/show_bug.cgi?id=18401
理查德史密斯对此修复的评论是:
通过实现当前提出的核心问题1430的方向来修复断言.除非相应的参数是参数包,否则不允许将包扩展用作别名模板的参数.
作为示例,引用的核心缺陷包括与您的代码基本相同的代码:
template<class... x> class list{};
template<class a, class... b> using tail=list<b...>;
template <class...T> void f(tail<T...>);
int main() {
f<int,int>({});
}
Run Code Online (Sandbox Code Playgroud)
缺陷说明:
处理此示例时存在实现差异.
缺陷给出的早期示例是一个更困难的情况,似乎要求模板别名不像模板的透明别名.由于这个实现问题,委员会显然倾向于禁止以某种方式使用模板别名,并且编译器实现者似乎正在使用该解决方案.
所以我的理解是这个代码在编写的当前规范下是有效的,但是存在实现问题,委员会最终可能会禁止它.
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |