Tem*_*Rex 6 c++ language-lawyer local-class name-lookup c++14
考虑以下代码,它模拟一个constexpr
lambda(为C++ 17提出,在C++ 14中不可用).
#include <iostream>
template<int M, class Pred>
constexpr auto fun(Pred pred)
{
return pred(1) <= M;
}
template<int M>
struct C
{
template<int N>
static constexpr auto pred(int x) noexcept
{
// simulate a constexpr lambda (not allowed in C++14)
struct lambda
{
int n_, x_;
constexpr auto operator()(int y) const noexcept
{
return this->n_ * this->x_ + y;
// ^^^^ ^^^^ <---- here
}
};
return fun<M>(lambda{N, x});
}
};
int main()
{
constexpr auto res = C<7>::template pred<2>(3);
std::cout << res; // prints 1, since 2 * 3 + 1 <= 7;
}
Run Code Online (Sandbox Code Playgroud)
这里,它lambda
是在类模板的函数模板成员中定义的.令人惊讶的是,我不得不this->
模仿lambda
成员变量n_
和x_
.
我的印象是,这只在依赖基类中是必需的,但lambda
该类只是一个本地类,而不是依赖基类.
问题:有人可以指向相关的标准版,查找模板中本地类成员的名称吗?
感谢 @dyp 的评论,这似乎是 Clang 3.5 / 3.6 中的一个错误,已在 Clang 3.7 Tip of trunk 中修复。G++ 4.8.1 通过 trunk 的提示也可以正确编译它。