模板内本地 class 成员的名称查找
Name lookup for local class members inside templates
考虑以下代码,它模拟了一个 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;
}
此处,lambda
定义在 class 模板的函数模板成员中。令人惊讶的是,我必须 this->
混淆 lambda
成员变量 n_
和 x_
。
实例 (with this->
, without this->
)
我的印象是这仅在依赖基 classes 中是必需的,但是 lambda
class 只是本地 class,而不是依赖基地 class.
问题:有人可以指点我相关的标准语以查找模板内本地 class 成员的名称吗?
感谢@dyp 的评论,is fixed in Clang 3.7 主干的尖端似乎是 Clang 3.5 / 3.6 中的错误。 G++ 4.8.1 通过主干提示也可以正确编译。
考虑以下代码,它模拟了一个 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;
}
此处,lambda
定义在 class 模板的函数模板成员中。令人惊讶的是,我必须 this->
混淆 lambda
成员变量 n_
和 x_
。
实例 (with this->
, without this->
)
我的印象是这仅在依赖基 classes 中是必需的,但是 lambda
class 只是本地 class,而不是依赖基地 class.
问题:有人可以指点我相关的标准语以查找模板内本地 class 成员的名称吗?
感谢@dyp 的评论,is fixed in Clang 3.7 主干的尖端似乎是 Clang 3.5 / 3.6 中的错误。 G++ 4.8.1 通过主干提示也可以正确编译。