#include <cassert>
#include <cmath>
int main()
{
struct point_of_cone
{
double x, y;
double z = [&] { using std::sqrt; return sqrt(x * x + y * y); }();
};
point_of_cone p = {3.0, 4.0};
assert(p.z == 5.0);
}
Работает нормально для clang++
из магистрали, но для g++
из магистрали происходит сбой с сообщением об ошибке (ссылка):
ошибка: «это» не было захвачено для этой лямбда-функции
Определение point_of_cone
в области пространства имен отлично работает для обоих.
Слегка измененное определение с [this]
лямбда-захватом прекрасно работает как в глобальной, так и в локальной области.
Какой компилятор прав?
[&]
захватитьthis
. Не уверен насчет новых стандартов, но ответ здесь предполагает, что нет: заголовок stackoverflow.com/questions/16323032/ - person Hayt   schedule 18.10.2016[&this]
? Я имел в виду, будет ли захват по умолчанию[&]
включатьthis
или нет. - person Hayt   schedule 18.10.2016There is no problem
, как и в 9.0, 16.0, 25.0, имеют точные представления, и результат std::sqrt(25.0) гарантированно будет точным? Мне нужно будет прочитать о C ++, если и когда возникнет необходимость. - person greybeard   schedule 11.11.2016hypot()
.) - person greybeard   schedule 11.11.2016double
наint
, чтобы сделать пример лучше? - person Tomilov Anatoliy   schedule 11.11.2016Should I change double to int to make example better?
Или вообще взять другой пример, который не пытается сравнить результаты трансцендентных функций на равенство, поскольку пример иллюстрирует захват в лямбде и длину этого обмена о сравнении двойников на равенство. На заметку:hypot()
избегаетundue overflow or underflow at intermediate stages
, но я не могу найти необходимую точность, эквивалентнуюsqrt()
. - person greybeard   schedule 11.11.2016