c++ - templates, typename, lambda -> 依赖名称不依赖?

标签 c++ templates lambda c++11 typename

考虑:

template < typename Something >
boost::function<void()> f()
{
  typedef typename Something::what type;
  return [](){};
}

在这段代码中,您需要类型名称,因为“what”是从属名称。但考虑一下:

template < typename Something >
boost::function<void()> f()
{
  return []()
  { 
    typedef typename Something::what type;
  };
}

编译器婊子们:“typename 不能在模板声明之外使用”

什么鬼?

这行得通:

template < typename Something >
boost::function<void()> f()
{
  return []()
  { 
    typedef Something::what type;
  };
}

创建一个意味着“什么”不再是从属名称的 lambda 是什么意思?或者这只是一个错误?

嘿...更正。后者不起作用。它说“某物”不存在。这个修改后的版本确实有效,但仍然不直观地不需要也不会接受“typename”。

template < typename T > struct wtf { typedef typename T::what type; };

template < typename Something >
boost::function<void()> f()
{
  return []() { typedef wtf<Something>::type type; };
}

当然,现在我有两个问题:原始的和 WTF 不会找到“Something”,除非它被用作模板参数??

最佳答案

这是一个非常有趣的问题。根据我的理解,根据 N3225 5.1.2/7,第一个“WTF”(lambda 主体中带有 typename 的那个)应该是正确的:

The lambda-expression’s compound-statement yields the function-body of the function call operator, but for purposes of name lookup, determining the type and value of this and transforming id-expressions referring to non-static class members into class member access expressions using (*this), the compound-statement is considered in the context of the lambda-expression.

因为 Something 是 lambda 表达式上下文中的从属名称,根据此,它应该是 lambda 函数体上下文中的从属名称报价。

关于c++ - templates, typename, lambda -> 依赖名称不依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4589056/

相关文章:

如果不使用 '&',C++ 模板无法推断引用类型

c++ - 具有模板化构造函数以及复制和移动构造函数的类

c++ - 为什么以下代码片段会加速代码?

c++ - 如何定义与使用 lambda 兼容的函数指针并将捕获作为回调

c++ - 当一行中只有一个 `#` 时,C++ 预处理器会做什么 - 没有别的?

c++ - 使用模板参数包代替宏

c++ - C 字符串的奇怪结果

java - 通过 Java-8 中的公共(public)字段减少对象集合

c++ - 在 MSVS2010 下将左值绑定(bind)到右值引用

c++ - 在定义 ClassName 之前采用参数 ClassName * 的 typedef 函数指针?