Поиск имени для локальных членов класса внутри шаблонов

Рассмотрим следующий код, который имитирует constexpr лямбда (предлагается для 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 определяется внутри члена шаблона функции шаблона класса. Удивительно, но я должен this->двусмысленно lambda переменные-члены n_ а также x_,

Живые примеры (с this->, без this->)

У меня сложилось впечатление, что это необходимо только в зависимых базовых классах, но lambda класс это просто локальный класс, а не зависимый базовый класс.

ВопросМожет ли кто-нибудь указать мне соответствующий стандарт для поиска имен локальных членов класса внутри шаблонов?

6

Решение

Благодаря комментарию @dyp, это кажется ошибкой в ​​Clang 3.5 / 3.6, что исправлено в Clang 3.7 кончик ствола. G ++ 4.8.1 через верхушку ствола компилирует это также правильно.

2

Другие решения


По вопросам рекламы [email protected]