在模板,在那里,为什么我必须把typename和template上依赖的名字呢?究竟什么是依赖名称?我有以下代码:
template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
// ...
template<typename U> struct inUnion {
// Q: where to add typename/template here?
typedef Tail::inUnion<U> dummy;
};
template< > struct inUnion<T> {
};
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
// ...
template<typename U> struct inUnion {
char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用lambdas和编译器,因为这里有另一个问题.
我刚刚意识到(并且确实非常正常)以下代码是有效的:
int main() {
auto l = [](){};
l.operator()();
}
Run Code Online (Sandbox Code Playgroud)
实际上标准说闭包类型有一个公共内联函数调用操作符等等,因此能够调用它是有意义的.
通过查看标准(以及工作草案)我无法解释的是,GCC(6.1)编译了以下代码段(clang 3.9没有):
int main() {
auto l = []<typename>(){};
l.operator()<void>();
}
Run Code Online (Sandbox Code Playgroud)
没有警告,没有错误.它是有效的代码还是被编译器拒绝?