Почему эти лямбды считаются разными типами? - PullRequest
0 голосов
/ 06 июня 2018

Я обнаружил это странное поведение с __PRETTY_FUNCTION__, но странная часть больше связана с тем, что, как я полагаю, является правильным поведением, а не с причудой в раскладывании.Я могу ошибаться.

auto lambda1 = [] { return __PRETTY_FUNCTION__; };
auto lambda2 = [] { return __PRETTY_FUNCTION__; };
//static_assert(std::is_same<decltype(lambda1), decltype(lambda2)>(), "Distinct types!");
std::cout << pretty(lambda1) << "\n" << pretty(lambda2) << std::endl;
lambda1(); // ...with T = main(int, const char**)::<lambda()>
lambda2(); // ...with T = main(int, const char**)::<lambda()>

Теперь меня не удивляет, что они не относятся к одному и тому же типу - только то, что они различны и не отражают это в своей подписи.(Это работает так же, когда лямбда-выражения возвращают ноль.) Почему это будет?

Я также укажу, что тип возвращаемого значения вообще не отображается, чего я никогда не видел в обычномфункция.Я уверен, что тип возвращаемого значения является строго типизированным и является фундаментальной частью типа лямбды, так почему бы его не указывать?

1 Ответ

0 голосов
/ 06 июня 2018

Каждая лямбда выражение обозначает уникальный тип закрытия.

[expr.prim.lambda.closure]

Типлямбда-выражения (которое также является типом объекта замыкания) является уникальным, неименованным типом класса без объединения, называемым типом замыкания, свойства которого описаны ниже.

Что и почему__PRETTY_FUNCTION__ отображает то же самое, вам нужно спросить об этом исполнителя (это не стандартный макрос), но, по предположению, трудно разобрать имя, которое является одновременно уникальным и представительным.

...